正在使用JSON Post请求创建对象



我正在使用JAX-RS(Jersey(和Jackson创建一个Rest API来处理JSON对象。我想让用户通过看到一个带有子体的帖子请求来创建一个Brand对象,其中只填充了品牌POJO的一些字段。

这是我的品牌实体:

@Data
@Entity
@NoArgsConstructor
public class Brand {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String name;
private int founded;
private String founder;
private String ceo;
private String headQuarters;

private Date created;
private Date updated;

@Transient
private List<Link> links = new ArrayList<>();
public Brand(String name){
this.name = name;
}
public void addLink(String href, String rel, String action){
Link link = new Link(href, rel, action);
links.add(link);
}
@PrePersist
protected void onCreate() {
created = new Date();
}
@PreUpdate
protected void onUpdate() {
updated = new Date();
}
}

如果用户发送以下JSON正文:

{
name:"brand-name",
founded:1974
}

我想要一个只有这两个值的新Brand对象,创建并设置id,其余的应该为null。当JSON解组时,有没有办法用这些值创建一个新的Object?还是我必须将其作为JsonObject,然后检查指定了哪些值,然后用它们创建一个新对象?

根据我的经验,更简单的方法是使用Google的JSON库-Gson(https://github.com/google/gson),或任何其他JSON库。

有了这个库,你可以这样做,以你喜欢的方式格式化数据

Brand aBrandObject = new Brand();
//set values
aBrandObject.setName("Google")
// ..........
String jsonData = new Gson().toJson(aBrandObject);

我设法找到了这个问题的答案。我在测试的时候肯定写错了什么,但球衣已经完全符合我的要求了。只需指定要将JSON转换为何种类型的POJO,就可以创建实体,并且所有未指定的字段都设置为默认值。如果随后将其添加到数据库中,则会添加Id和创建的时间戳。很棒的东西!

这取决于端点是如何创建的。例如,你可以用这种方式实现

@Path("/brands")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response processData(Brand aBrand)
{
// In this way, the same entity will be automatically created and you can use it
System.out.println(aBrand.getName());
}

//or 
@POST
@Path("/brands")
@Consumes(MediaType.APPLICATION_JSON)
public Response processData(InputStream inputStream) 
{
//read json string data in inputStream
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder out = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
out.append(line);
}
String jsonStringData = out.toString();
}```

最新更新