【问题标题】:How to map this json to a custom class in java如何将此json映射到java中的自定义类
【发布时间】:2021-12-27 12:50:40
【问题描述】:

假设我有以下 json

[
    {
        "00080005":{
            "vr":"CS",
            "Value":[
                "ISO_IR 100"
            ]
        },
        "00080054":{
            "vr":"AE",
            "Value":[
                "DCM4CHEE"
            ]
        }
    }
]

如何在java中创建一个自定义类来映射它? 我试过这个类的形状

public class custom1 {
    private Map<String, cusomt2> id;
}

cusomt2的形状是

public class cusomt2 {
    private Object vr;
    private Object[] Value;
}

并使用 Jackson 映射器进行映射

ObjectMapper mapper = new ObjectMapper();
List<custom1> test = Arrays.asList(mapper.readValue(responseStream, custom1[].class));

正如预期的那样,给我一个错误:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "00080005"

我想要“0008005”作为字段值而不是字段键,这些值是根据API动态变化的,那么如何映射这个json,除了最后一个选项op custom deserialize还有什么直接的方法吗?

【问题讨论】:

  • 您认为mapper.readValue(responseStream, custom2[].class) 会做什么? (特别是custom2[]。)为什么将结果(包装在列表中)分配给List&lt;custom1&gt;
  • 我编辑了,应该是custom1[]而不是custom2[],但这不是问题

标签: java json serialization jackson objectmapper


【解决方案1】:

错误表明没有id字段导致反序列化失败。

但是,输入 JSON 表示地图列表/数组Map&lt;String, Pojo&gt;,其中Pojo 应定义为:

@Data
class Pojo {
    String vr;
    String[] value;
}

那么 JSON 应该使用 TypeReference 反序列化:

String json = ...; // long json string
ObjectMapper mapper = new ObjectMapper();
List<Map<String, Pojo>> data = mapper.readValue(json, new TypeReference<>() {});

【讨论】:

    【解决方案2】:

    我知道是什么问题,实际上有2个问题,@Alex Rudenko解决了一个,另一个问题是API返回Value作为大写字母,而不是value,实际上我指定它为Value在课堂上正确,但问题是它是一个私有属性,它的 getter 名为 getValue,这在映射时让杰克逊感到困惑,它认为 getValuevalue 字段的 getter 而不是 Value

    • 第一个解决方案(推荐)是在类中的Value 属性上设置@JsonProperty("Value") 注释。

    所以这个类现在看起来像这样

    public class custom1 {
    
        private String vr;
        @JsonProperty("Value")
        private String[] Value;
    
        //getter & setters
    }
    
    • 第二种解决方案是将Value 设为公开,以避免使用它的getter。

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 2014-01-21
      • 1970-01-01
      • 2014-03-04
      • 1970-01-01
      • 2013-09-29
      • 1970-01-01
      • 2018-06-19
      • 1970-01-01
      相关资源
      最近更新 更多