当前位置: 首页 > 知识库问答 >
问题:

@JSONProperty嵌套字段映射问题

邵献
2023-03-14
{
  "success" : true,
  "message" : "ok",
  "product" : {
     "name : "food",
     "price" : 123
  }
}
public class RequestDTO {

   @JsonProperty("success")
   boolean success;

   @JsonProperty("message")
   boolean message;

   @JsonProperty("product.name")
   Stirng name;

   @JsonProperty("product.price")
   Long price;

}

我想映射到产品字段,而不创建product

应该如何序列化和反序列化?

共有1个答案

卞经业
2023-03-14

让我们首先编辑requestdto:

@JsonSerialize(using = Serializer.class)
public class RequestDTO {
    @JsonProperty("success")
    boolean success;

    @JsonProperty("message")
    boolean message;

    String name;

    Long price;

    @JsonProperty("product")
    private void unpackNestedProduct(Map<String,Object> product) {
        this.name = (String)product.get("name");
        this.price = Long.valueOf((Integer)product.get("price"));
    }

    @JsonProperty("message")
    private void unpackMessage(String messageStr) {
        this.message = messageStr.equalsIgnoreCase("ok");
    }
}

并添加序列化程序类:

public class Serializer extends StdSerializer<RequestDTO> {

    public Serializer() {
        this(null);
    }

    public Serializer(Class<RequestDTO> t) {
        super(t);
    }

    @Override
    public void serialize(RequestDTO value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
        jgen.writeStartObject();
        jgen.writeBooleanField("success", value.success);
        jgen.writeStringField("message", value.message ? "ok" : "PutYourNotOKValueHere");

        jgen.writeFieldName("product");
            jgen.writeStartObject();
            jgen.writeStringField("name", value.name);
            jgen.writeNumberField("price", value.price);
            jgen.writeEndObject();

        jgen.writeEndObject();
    }
}

然后我们可以做:

String json = "{\"success\": true, \"message\": \"ok\", \"product\":{ \"name\": \"food\", \"price\": 123}}";
ObjectMapper objectMapper = new ObjectMapper();

RequestDTO requestDTO = objectMapper.readValue(json, RequestDTO.class);
System.out.println("To Java object: "+ requestDTO);
System.out.println("Back to JSON: "+ objectMapper.writeValueAsString(requestDTO));
To Java object: RequestDTO(success=true, message=true, name=food, price=123)
Back to JSON: {"success":true,"message":"ok","product":{"name":"food","price":123}}
    null
 类似资料:
  • 假设我有这些实体: null

  • 有没有什么方法可以将嵌套的JSON值映射到字段而不需要额外的类?我有一个JSON响应 但是在中,我只需要值。因此,我决定创建Kotlin数据类,并尝试使用注释的选项 下面的代码正在工作 我有几个嵌套值,为它们创建额外的类是相当夸张的。还有比为节点创建嵌套类更好的方法吗?

  • 我有一个带有对象的RealmObject类,它实际上是PrimaryKey作为这个对象中的字符串。但不允许将对象作为主键。 因为目前不可能更改服务器的响应结构,所以我尝试了不同的方法来解决这个问题。但到目前为止,没有一个奏效。我在Android Studio中使用“io.realm:realm-gradle-plugin:0.87.2”作为和“realm-android”插件。 谢谢beeende

  • 我正在使用弹性搜索和Spring数据弹性。并尝试使用多重搜索。问题是在使用类字段搜索时,它不适用于嵌套字段。我的映射如下所示 我有一个带有searchQuery的endpoint,比如: 问题是查询不适用于嵌套字段。有什么建议吗? 使现代化 事实上,嵌套对象可以查询为 有没有两个类似的问题

  • 假设我有几个这样的类: 我想迭代所有包含的子类(不是继承的),并获得嵌套对象树中所有字段的列表。但是,当我使用这样的反射代码时: 在“do somethine here”步骤中,我想访问myField的子字段,但在Field api中没有看到任何直接允许我这样做的内容。我试过: MyField.getDeclaringClass(). getDeclaredFields()- 和 MyField.

  • 我用的是Protobuf 3。从文档来看,似乎无法定义嵌套贴图: 我正在尝试创建一种消息类型来表示期权链的定价信息(出价和要价)。对于那些不熟悉这些金融工具的人,基本上我有一套“到期日期(YYYYMMDD)”。在每个过期日期中,我都有一组“strikes(float number;如果需要,可以用字符串表示,我同意)”。在每次行使中,我有两个期权,一个“看跌”和一个“看涨”(这被称为期权的“右”)