繁体   English   中英

Jackson: Deserialize JSON array from JSON object into Java List

[英]Jackson: Deserialize JSON array from JSON object into Java List

我已经被这个绊倒了一段时间。 我有一个 Spring 应用程序并想解析以下 JSON:

{
  "metadata": {...}
  "response": {
    "objects": [
      {
        "name": "someName",
        "properties": [<array_of_properties>]
      },
      ...
    ]
  }
}

进入以下 Java 对象的列表:

public class MyClass {
  String name;
  List<CustomProperties> customProperties;
}

意思是,我只想提取objects数组并仅解析它。 我曾尝试使用自定义反序列化器并且有效,但我必须这样做:

@JsonDeserialize(using=MyDeserializer.class)
public class MyClassList extends ArrayList<MyClass>{}

接着:

ObjectMapper objectMapper = new ObjectMapper();
List<MyClass> list = objectMapper.readValue(json, MyClassList.class) 

无论如何要避免扩展ArrayList ,因为目前我这样做是为了能够访问.class属性。

你可以用几个类定义你的 json 结构

public class MyJson {
  private MyResponse response;
  ...
}

public class MyResponse {
  private List<MyClass> objects;
  ...
}

public class MyClass {
  String name;
  List<CustomProperty> customProperties;
  ...
}

您可以使用 Jackson 将 json 字符串解析为MyJson class,不需要特殊的@JsonDeserialize

ObjectMapper objectMapper = new ObjectMapper();
MyJson myJson = objectMapper.readValue(json, MyJson.class);
List<MyClass> list =  myJson.getResponse().getObjects();

请记住,此代码只是草稿,所有类都应该有设置器(和获取器),并且需要一些 null 检查

你可以做这样的事情。 我觉得这会更干净

@JsonIgnoreProperties(ignoreUnknown = true)
class Wrapper{
  private Response response;
  //setters, getters
}

@JsonIgnoreProperties(ignoreUnknown = true)
class Response{
  private List<MyClass> objects;
  //setters, getters
}

@JsonIgnoreProperties(ignoreUnknown = true)
public class MyClass {
  String name;
  List<CustomProperties> customProperties;
  //setters, getters
}

ObjectMapper objectMapper = new ObjectMapper();
Wrapper wrapper = objectMapper.readValue(json, Wrapper.class) 

您可以通过遍历列表来提取对象和 CustomProperties。 您可以通过@JsonIgnoreProperties(ignoreUnknown = true)仅声明您感兴趣的字段并忽略其他字段(例如,我没有包含元数据)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM