使用Jackson访问JSON列表,然后开始映射到对象

时间:2014-03-27 18:29:58

标签: json jackson

我正在尝试使用Jackson来阅读看起来像这样的JSON:

{
  api: {
    version: "1.0"
  },
  list: [
    {                  // actually
       foo: "foo",     //   x.phoo: "foo"
       bar: "mane",    //   x.barr: "mane"
       baz: "padme",   //   y.bazz: "padme"
       qux: "hum"      //   y.quux: "hum"
    },
    ...
  ]
}

我有完整的JSON字符串。我真正需要的只是对象列表,每个对象都包含键{foo bar baz quz}的值。你会怎么做?我不知道是否使用JsonNode并浏览树,或者我是否可以访问列表然后使用ObjectMapper将每个列表项映射到对象。

还有一个障碍。实际上没有来的密钥是foo bar baz qux,而是x.phoo x.barr y.bazz {{1我想要y.quux foo bar baz作为创建对象中的字段名称。我希望使用qux的{​​{1}}方法。

2 个答案:

答案 0 :(得分:2)

您可以创建一个表示整个JSON文档的对象。

@JsonIgnoreProperties(ignoreUnknown = true)
public class MyJsonDocument {

  private List<Foo> foos; // just declare this one field, the rest will get ignored
  ...
}

并使用ObjectMapper来阅读整个内容。

至于字段名称,

@JsonNaming(MyXDroppingPropertyNamingStrategy.class)
public class Foo {
    ...

应该有魅力。

答案 1 :(得分:1)

我最近做过这样的事情,这是我快速而又肮脏的解决方案。

ObjectMapper mapper = new ObjectMapper();
Map<String,Object> record = mapper.readValue( jsonString ,Map.class);
Map<String,Object>[] list = (Map<String, Object>[]) record.get("list");

/* Retrieve keyset (should be foo, bar, baz, qux) */
Set<String> keys = list[0].keySet();

/* Retrieve value of foo */
String foo = list[0].get("foo").toString();

这取决于很多通用对象类型和转换,以便能够使用&#34; list&#34;对象作为地图数组。一个更健壮的解决方案是显式类结构,它反映了json的结构,并使用基本相同的代码拉入json,但处理结果更简单。

MyRecordClass record = mapper.readValue( jsonString ,MyRecordClass.class);
String foo = record.list[0].foo;

第二种方法取决于类的组件变量名称和json的字段名称之间的良好映射。还有关于结构匹配。总的来说,除非我打算使用这些记录对象来弥补我创建课程所花费的时间,否则我不会为此烦恼。