Java Jackson将字符串字段解析为JSON
我有以下JSON:Java Jackson将字符串字段解析为JSON,java,jackson,Java,Jackson,我有以下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的奇怪结构 问题
{
"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对象
- 示例中提供的json与模式不对应。例如,根据
,json
是一个字符串字段(用双引号括起来),而根据模式,它是一个some_key
字段。您需要将json更改为如下所示(或将Boo
更改为字符串类型):some_值
{ “某些键”:{“a\”:1,“b\”:“text\”} }
- 没有接球手或二传手
无法反序列化,无法通过反射访问getter/setterJackson
- 有几个问题:
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;
}
}
反序列化:
ObjectMapper mapper = new ObjectMapper();
Foo response = mapper.readValue("{\"some_key\": {\"a\": 1, \"b\": \"text\"}}", Foo.class);
步骤1:
公共类BarDeserializer扩展JsonDeserializer{
@凌驾
公共条反序列化(JSONP,反序列化上下文ctxt)
抛出IOException、JsonProcessingException{
String text=p.getText();
return.readValue(text,Bar.class);
}
}
步骤2:
福班{
@JsonDeserialize(使用=BarDeserializer.class)
加上一些按键;
}
或
@JsonDeserialize(使用=BarDeserializer.class)
分类栏{
INTA;
b串;
}
@tèliang非常接近-只需要比注释多一点空间来展示工作示例
与:
那么当前的ObjectMapper
实际上就是JsonParser.getCodec()
:
。。。显示预期值:
Bar [a=1, b=text]
我没有添加getter和setter来保持示例的简短。好的,在这种情况下,在删除
some\u key
value周围的括号后应该可以工作。我的问题是我不能删除括号。对不起,我指的是双引号,而不是括号。我也指的是双引号。问题是真正的json很大,一些内部模型有这样的结构。如何在反序列化()
中访问当前的ObjectMapper
?使用相同的ObjectMapper
将导致堆栈溢出错误,不是吗?谢谢你的回答。但是对我来说,ObjectMapper
的转换似乎并不好。我找到了一种避免它的方法:使用ObjectCodec.getFactory().createParser(…)
创建一个JsonParser
,并将其传递给ObjectCodec.readValue(…)
。看见
class Foo {
@JsonDeserialize(using = BarDeserializer.class)
private Bar some_key;
}
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]