7

我想将字符串 {"a": 1.0} 作为通用 Java 对象读取,同时保持相同的字符串格式。但是,当我尝试时,杰克逊会自动将内部表示更改为{a = 1}. 换句话说,我怎样才能得到下面的代码来打印{"a": 1.0}而不是{a = 1}?请注意,我必须将其读为Object(由于其他程序限制)。

import org.codehaus.jackson.map.ObjectMapper;

public class Main {

    public static void main(String[] args) {
        try
    {
            ObjectMapper mapper = new ObjectMapper();
            Object myObject = mapper.readValue("{\"a\": 1.0}", Object.class);
            System.out.println(myObject.toString());            
    }
    catch (Exception e)
    {
        e.printStackTrace();
      System.err.println(e.getMessage()); 
    }
    }

}
4

4 回答 4

7

创建的对象将是一张地图(就像其他评论一样),因此它toString会产生您所看到的内容,{a = 1}. 为了让您的代码打印出更接近输入值的内容,您需要使用 Jackson 将其写回,例如:

System.out.println(mapper.writeValueAsString(myObject));

这给了我我相信你正在寻找的东西:

{"a":1.0}

换句话说,Jackson 已将您的输入字符串反序列化为任意 Java 对象。当您调用对象时,当然会使用toString它自己的对象。toString这可以随心所欲地编写对象,包括使用方法 from Object。要重现输入字符串,您必须使用 Jackson 将我们的对象序列化回来。

于 2011-04-22T22:26:51.970 回答
3

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

Object myObject = mapper.readValue("{\"a\": 1.0}", SomeClass.class);
于 2011-02-14T16:45:26.343 回答
2

当 Jackson 被告知将 JSON 绑定到 Object.class 时,它就是这样做的;但由于它不知道 JSON 中可能包含什么(或可能想要使用的类),它必须使用大多数基本的 Java 类型:地图、列表、数字、布尔值和字符串。所以任何 JSON 对象都由 Map 表示;JSON Array by List 等等。

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

为此,类型本身(或其超类型之一)必须使用 @JsonTypeInfo 注释;或者,如果它是 Object 属性,则为属性(字段或方法)@JsonTypeInfo。

于 2011-02-14T20:09:10.813 回答
2

如果你使用调试器,你会看到返回的 Object 的类型是LinkedHashMap. 所以你看到的是LinkedHashMap.toString(). Jackson 无法更改这一点,因此您可以将其转换为 Map 并自己创建字符串,或者要求另一种返回类型为您生成 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);
}

输出:

{
    'a':'1.0'
}
于 2011-02-14T16:46:56.320 回答