【问题标题】:Creating Object with JSON Post request使用 JSON Post 请求创建对象
【发布时间】:2020-08-01 21:17:54
【问题描述】:

我正在使用 JAX-RS (Jersey) 和 Jackson 创建一个 Rest API 来处理 JSON 对象。我想让用户通过查看带有子主体的帖子请求来创建品牌对象,该子主体仅填写了品牌 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 对象,created 和要设置的 id,其余的应该为 null。当 JSON 解组时,我有没有办法用这些值创建一个新对象?还是我必须将它作为 JsonObject 接收,然后检查指定了哪些值,然后用它们创建一个新对象?

【问题讨论】:

    标签: java json jersey jax-rs


    【解决方案1】:

    根据我的经验,更简单的方法是使用 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 相互转换不是问题,我想知道是否有一种方法可以让我只使用 post 请求中提供的子对象来创建一个新对象,或者我是否必须接受该请求并且手动把它变成一个新对象。
    • 您的端点是什么样子的?我的意思是数据将发布到哪里?
    • 只是对/brands的POST请求
    【解决方案2】:

    我设法找到了这个问题的答案。测试时我一定写错了,但球衣已经完全符合我的要求。通过简单地指定您希望将 JSON 转换为哪种类型的 POJO,将创建实体并将所有未指定的字段设置为默认值。如果您随后将其添加到数据库中,则会添加 Id 和创建的时间戳。好东西!

    【讨论】:

      【解决方案3】:

      这取决于端点是如何创建的。例如,你可以这样实现它

      @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();
      
      }```
      

      【讨论】:

        猜你喜欢
        • 2016-11-18
        • 2011-10-02
        • 2021-03-23
        • 2017-05-04
        • 2019-01-09
        • 1970-01-01
        • 2022-11-17
        • 2017-09-18
        • 1970-01-01
        相关资源
        最近更新 更多