我正在尝试使用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}}方法。
答案 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的字段名称之间的良好映射。还有关于结构匹配。总的来说,除非我打算使用这些记录对象来弥补我创建课程所花费的时间,否则我不会为此烦恼。