Java Jackson将字符串字段解析为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的奇怪结构 问题

我有以下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
        是一个字符串字段(用双引号括起来),而根据模式,它是一个
        Boo
        字段。您需要将json更改为如下所示(或将
        some_值
        更改为字符串类型):

        {
        “某些键”:{“a\”:1,“b\”:“text\”}
        }

      • 没有接球手或二传手
        Jackson
        无法反序列化,无法通过反射访问getter/setter

      以下是工作示例:

      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]