使用 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 类 - SomeClassOriginal
和SomeClass
,它们之间唯一的区别是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"}}
我有一个 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 类 - SomeClassOriginal
和SomeClass
,它们之间唯一的区别是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"}}