Java 将JSON嵌套对象解析为字符串
我有JSON对象,我不想解析一些嵌套对象。相反,我希望它们作为字符串(我有我的理由)。有没有简单的方法? 我试图实现自定义反序列化器,但我发现它以不同的方式复杂(我不想连接令牌,我只需要整个对象。它也不考虑‘:’作为令牌,所以需要特殊的处理),或者我可能错过了SMTH。 在json中加引号也不是一个选项。我需要json的原样 JSON示例:Java 将JSON嵌套对象解析为字符串,java,json,jackson,Java,Json,Jackson,我有JSON对象,我不想解析一些嵌套对象。相反,我希望它们作为字符串(我有我的理由)。有没有简单的方法? 我试图实现自定义反序列化器,但我发现它以不同的方式复杂(我不想连接令牌,我只需要整个对象。它也不考虑‘:’作为令牌,所以需要特殊的处理),或者我可能错过了SMTH。 在json中加引号也不是一个选项。我需要json的原样 JSON示例: { "lastName":"Bitman", "jsonObjectIDontWantToParse":{ "somefield":
{
"lastName":"Bitman",
"jsonObjectIDontWantToParse":{
"somefield":1234
}
}
我想要解析json的Java对象
public class Jack {
public String lastName;
public String jsonObjectIDontWantToParse;
@Override
public String toString() {
return "lastName=" + lastName + ", jsonObjectIDontWantToParse=" + jsonObjectIDontWantToParse;
}
}
这是我的主要课程
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
final String jackString = "{\"lastName\":\"Bitman\",\"jsonObjectIDontWantToParse\":{\"somefield\":1234}}";
Jack user = mapper.readValue(jackString, Jack.class);
System.out.println(user);
}
我希望输出是这样的
lastName=Bitman, jsonObjectIDontWantToParse={"somefield":1234}
更新:所以基本上这就是我要寻找的示例(除了没有这样的方法)。我想跳过对该节点的任何分析
public class LeaveAsStringDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
return jp.getWholeObject().toString();
}
}
公共类leaveAsString序列化程序扩展JsonDeserializer{
@凌驾
公共字符串反序列化(JsonParser jp,反序列化上下文ctxt)引发IOException{
返回jp.getWholeObject().toString();
}
}
要实现此目的:
lastName=Bitman, jsonObjectIDontWantToParse={"somefield":1234}
您只需要转义jsonObjectDonTwantToParse的字符串表示形式
。这意味着将其改为:
jsonObjectIDontWantToParse: "{ \"somefield\": 1234 }"
我认为,您应该使用
JsonNode
类作为jsonobjectidontwarse
属性的一种类型:
class Jack {
private String lastName;
private JsonNode jsonObjectIDontWantToParse;
// getters, setters, toString, other
public String getJsonObjectIDontWantToParseAsString() {
return jsonObjectIDontWantToParse.toString();
}
}
如果要获取字符串表示,可以添加一个附加方法getjsonobjectidontwanttoparseastring
用法示例:
ObjectMapper mapper = new ObjectMapper();
Jack jack = mapper.readValue(json, Jack.class);
System.out.println(jack);
System.out.println(jack.getJsonObjectIDontWantToParseAsString());
以上程序打印:
lastName=Bitman, jsonObjectIDontWantToParse={"somefield":1234}
{"somefield":1234}
你不能再序列化一次吗?你的主类和Java对象目前是一样的,我想你的意思是它们是不同的代码块。这不是一个选择。我不知道嵌套对象的真实结构,也不知道如何使用映射。。。意味着更多的内存和cpu。@Dan Temple谢谢。修复了在json中加引号可能与
重复的问题。我需要json的原样。
请仔细阅读“在json中加引号不是一个选项。我需要json的原样。”如果在一个项目中使用java类,效果很好。但是,如果您有更多的项目和jar中的类,您将需要在任何地方都包括JacksonJAR。这和使用对象是一样的。JsonNode内部有LinkedHashMap,正在解析字符串以适合该映射。我想知道是否有办法跳过解析,只使用字符串字段。无论如何,谢谢你。干得好。我认为这是最简单的方法。你可以使用你提到的Map
。如果您真的想跳过序列化,您必须编写自定义反序列化程序并连接令牌。现在我将使用对象。但我希望能够跳过性能和内存问题的解析