使用 ObjectMapper 解析 json,其中 json 键包含 json 作为值

Parse json using ObjectMapper where json key contains json as a value

我有一个 class 具有这样的结构:

class SomeClass {

        private String stringValue; 
        private Collection<String> collectionValue = new ArrayList<>();
        private String jsonStringValue;
        private boolean booleanValue;
}

然后我用

objectMapper.readValue(jsonString, SomeClass.class);

从 JSON 解析这个对象。

主要问题是 jsonStringValue 是 json 内部的 json:

{"stringValue" : "someString",
 "collectionValue" : ["123456", "234567", "hello"],
 "jsonStringValue" : "{
    "someKey" : 1,
    "anotherKey" : {
      "againKey" : "value"
     }
  },
  "booleanValue" : true
}

并尝试解析它抛出的 jsonStringValue

com.fasterxml.jackson.core.JsonParseException: Unexpected character ('a' (code 97)): was expecting comma to separate Object entries

完全是我示例中的 "a" 个字符(json 出于安全目的进行了修改)

我相信应该有一些转义规则来将 json 解析为字符串。

如何将 json 值解析为字符串?

首先,您的 JSON 字符串 无效 因为 jsonStringValue 中左括号前有多余的双引号。有效的看起来像这样:

{
  "stringValue" : "someString",
  "collectionValue" : ["123456", "234567", "hello"],
  "jsonStringValue" : {
    "someKey" : 1,
    "anotherKey" : {
      "againKey" : "value"
    }
  },
  "booleanValue" : true
}

其次,jsonStringValue不是一个简单的String对象,它是一个嵌套的JSON对象。因此,你应该为它创建相应的 类 如下:

Class SomeClass {
    private String stringValue; 
    private List<String> collectionValue = new ArrayList<>();
    private JsonStringValue jsonStringValue;
    private boolean booleanValue;

    //general getters and setters
}

Class JsonStringValue  {
    private int someKey;
    private AnotherKey anotherKey;

    //general getters and setters
}

Class AnotherKey {
    private String againKey;

    //general getters and setters
}

最后,给定的JSON字符串可以用ObjectMapper转换成SomeClass POJO。

ObjectMapper mapper = new ObjectMapper();
SomeClass someClass = mapper.readValue(jsonStr, SomeClass.class);
System.out.println(someClass.getjsonStringValue().getAnotherKey().getAgainKey());

控制台输出:

value

已更新

如果你还想把jsonStringValue对象改成String,另一种方法如下:

创建2 类 - SomeClassOriginalSomeClass,它们之间唯一的区别是jsonStringValue的数据类型。前一个是JsonNode,后一个是String.

Class SomeClassOriginal {
    private String stringValue; 
    private List<String> collectionValue = new ArrayList<>();
    private JsonNode jsonStringValue;
    private boolean booleanValue;

    //general getters and setters
}

Class SomeClass {
    private String stringValue; 
    private List<String> collectionValue = new ArrayList<>();
    private String jsonStringValue;
    private boolean booleanValue;

    public SomeClass(SomeClassOriginal someClassOriginal) {
        super();
        this.stringValue = someClassOriginal.stringValue;
        this.collectionValue = someClassOriginal.collectionValue ;
        this.jsonStringValue= someClassOriginal.jsonStringValue.toString();
        this.booleanValue= someClassOriginal.booleanValue;
    }

    //general getters and setters
}

然后你可以像这样得到 jsonStringValue 作为 String:

ObjectMapper mapper = new ObjectMapper();
SomeClassOriginal someClassOriginal = mapper.readValue(jsonStr, SomeClassOriginal.class);
SomeClass someClass = new SomeClass(SomeClassOriginal);
System.out.println(someClass.getjsonStringValue());

控制台输出:

{"someKey":1,"anotherKey":{"againKey":"value"}}