我有以下JSON:
{
"some_key": "{\"a\": 1, \"b\": \"text\"}"
}
正如您所看到的,some_key
字段不是JSON对象,它是一个字符串,包含有效的JSON。
我想将其解析为以下结构:
class Foo {
Bar some_key;
}
class Bar {
int a;
String b;
}
更新:
A类和B类,有getter和setter,构造函数。我没有表现出来 他们保持样本简短。
我无法编辑JSON的奇怪结构。
问题是如何让Jackson解析内部字符串字段为 JSON对象。
答案 0 :(得分:6)
@t_liang非常接近-只需要比注释多一点的空间即可显示工作示例...
使用:
ObjectMapper
那么当前的JsonParser.getCodec()
实际上就是public class BarDeserializer extends JsonDeserializer<Bar> {
@Override
public Bar deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
String text = p.getText();
ObjectMapper mapper = (ObjectMapper) p.getCodec();
return mapper.readValue(text, Bar.class);
}
}
:
ObjectMapper mapper = new ObjectMapper();
Foo foo = mapper.readValue(
"{ \"some_key\": \"{\\\"a\\\": 1, \\\"b\\\": \\\"text\\\"}\" }",
Foo.class);
System.out.println(foo.getSome_key());
然后这个...
Bar [a=1, b=text]
...显示期望值:
{{1}}
答案 1 :(得分:4)
step 1:
public class BarDeserializer extends JsonDeserializer<Bar> {
@Override
public Bar deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
String text = p.getText();
return <your ObjectMapper>.readValue(text, Bar.class);
}
}
step 2:
class Foo {
@JsonDeserialize(using=BarDeserializer.class)
Bar some_key;
}
or
@JsonDeserialize(using=BarDeserializer.class)
class Bar {
int a;
String b;
}
答案 2 :(得分:0)
有几个问题:
json
与架构不对应。例如。根据{{1}},json
是一个字符串字段(用双引号括起来),而根据架构,它是some_key
字段。您需要将json更改为如下所示(或将Boo
更改为String类型):
some_value
没有吸气剂或制定者。 {
"some_key": {\"a\": 1, \"b\": \"text\"}
}
无法反序列化无法通过反射访问getter / setter。
以下是工作示例:
Jackson
反序列化:
class Foo {
Bar some_key;
public Bar getSome_key() {
return some_key;
}
public void setSome_key(Bar some_key) {
this.some_key = some_key;
}
}
class Bar {
int a;
String b;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
}