杰克逊将字符串字段解析为JSON

时间:2017-03-30 12:52:11

标签: 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的奇怪结构。

  • 问题是如何让Jackson解析内部字符串字段为 JSON对象。

3 个答案:

答案 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;
    }
}