Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.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 Jackson中的通用对象序列化_Java_Json_Jackson - Fatal编程技术网

Java Jackson中的通用对象序列化

Java Jackson中的通用对象序列化,java,json,jackson,Java,Json,Jackson,我希望将字符串{“a”:1.0}作为通用Java对象读入,同时保持相同的字符串格式。但是,当我尝试时,Jackson会自动将内部表示更改为{a=1}。换句话说,我如何让下面的代码打印{“a”:1.0}而不是{a=1}?请注意,我必须将其作为对象读入(由于其他程序限制) 您需要一个与所需json结构匹配的现有类。对象不是这样的类。如果需要,您仍然可以将其称为对象: Object myObject = mapper.readValue("{\"a\": 1.0}", SomeClass.class)

我希望将字符串
{“a”:1.0}
作为通用Java对象读入,同时保持相同的字符串格式。但是,当我尝试时,Jackson会自动将内部表示更改为
{a=1}
。换句话说,我如何让下面的代码打印
{“a”:1.0}
而不是
{a=1}
?请注意,我必须将其作为
对象读入(由于其他程序限制)


您需要一个与所需json结构匹配的现有类。对象不是这样的类。如果需要,您仍然可以将其称为
对象

Object myObject = mapper.readValue("{\"a\": 1.0}", SomeClass.class);

如果使用调试器,您将看到返回对象的类型是
LinkedHashMap
。因此,您看到的是
LinkedHashMap.toString()的输出。Jackson无法改变这一点,因此您可以将其转换为映射并自己创建字符串,或者请求另一个返回类型为您生成JSON字符串:

if(myObject instanceof Map<?, ?>){
    final Map<?, ?> map = (Map<?, ?>) myObject;
    final StringBuilder sb = new StringBuilder("{");
    boolean first = true;
    for(final Entry<?, ?> entry : map.entrySet()){
        if(first){
            first = false;
        } else{
            sb.append(",");
        }
        sb.append("\n\t'")
            .append(entry.getKey())
            .append("':'")
            .append(entry.getValue())
            .append("'");
    }
    if(!first){
        sb.append("\n");
    }
    sb.append("}");
    System.out.println(sb.toString());

} else{
    System.out.println(myObject);
}

当Jackson被告知将JSON绑定到Object.class时,它就这样做了;但由于它对JSON中可能包含的内容(或您可能希望使用的类)没有先验知识,因此它必须使用最基本的Java类型:映射、列表、数字、布尔值和字符串。因此,任何JSON对象都由Map表示;JSON数组按列表排列,等等

如果需要自定义对象,则必须指定其类型;或者,在序列化时,允许包含显式类型信息(“多态类型处理”)。这将添加类名或类型名,并可用于反序列化回确切的类型


为此,类型本身(或其超类型之一)必须使用@JsonTypeInfo注释;或者,如果它是一个对象属性,@JsonTypeInfo for property(field或method)。

创建的对象将是一个映射(与其他注释一样),因此它的
toString
生成您看到的内容,
{a=1}
。要使代码打印出更接近输入值的内容,您需要使用Jackson将其写出来,如下所示:

System.out.println(mapper.writeValueAsString(myObject));
这给了我我相信你在寻找的东西:

{"a":1.0}

换句话说,Jackson将您的输入字符串反序列化为任意Java对象。在对象上调用
toString
时,当然会使用它自己的
toString
。这可以随心所欲地编写对象,包括使用
object
中的方法。要复制输入字符串,必须使用Jackson将对象序列化回原处。

这对我来说没有意义。对象没有键“a”的任何属性,因此如何才能像这样读入它?你不需要用这个属性创建一个类吗?也许他假设Jackson通过某种方式通过心灵感应找出了预期的类型。。。实际上,type Object.class对Jackson有特殊的处理:它将创建映射、列表和包装器类型(显然都是对象)的“自然”映射。Jackson支持写出映射,因此您可以执行以下操作:
System.out.println(mapper.writeValueAsString(myObject))
而不是编写自己的序列化程序。
System.out.println(mapper.writeValueAsString(myObject));
{"a":1.0}