Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将JSON嵌套对象解析为字符串_Java_Json_Jackson - Fatal编程技术网

Java 将JSON嵌套对象解析为字符串

Java 将JSON嵌套对象解析为字符串,java,json,jackson,Java,Json,Jackson,我有JSON对象,我不想解析一些嵌套对象。相反,我希望它们作为字符串(我有我的理由)。有没有简单的方法? 我试图实现自定义反序列化器,但我发现它以不同的方式复杂(我不想连接令牌,我只需要整个对象。它也不考虑‘:’作为令牌,所以需要特殊的处理),或者我可能错过了SMTH。 在json中加引号也不是一个选项。我需要json的原样 JSON示例: { "lastName":"Bitman", "jsonObjectIDontWantToParse":{ "somefield":

我有JSON对象,我不想解析一些嵌套对象。相反,我希望它们作为字符串(我有我的理由)。有没有简单的方法? 我试图实现自定义反序列化器,但我发现它以不同的方式复杂(我不想连接令牌,我只需要整个对象。它也不考虑‘:’作为令牌,所以需要特殊的处理),或者我可能错过了SMTH。 在json中加引号也不是一个选项。我需要json的原样

JSON示例:

{
   "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
。如果您真的想跳过序列化,您必须编写自定义反序列化程序并连接令牌。现在我将使用对象。但我希望能够跳过性能和内存问题的解析