【问题标题】:Howto keep types in JSON output with XStream如何使用 XStream 在 JSON 输出中保留类型
【发布时间】:2014-07-28 08:44:31
【问题描述】:

我正在尝试使用 XStream 将 Java 对象序列化为 XML 和 JSON。为此,我使用了一个使用 HierarchicalStreamWriter 的自定义转换器。流编写器只有一个 setValue() 方法来添加数据。当我通过这种方法添加数据时,JSON 输出将始终是一个字符串。如何使用转换器以 JSON 格式输出整数、布尔值和日期?

所以简而言之,数据显示为:{ "data": "23" }

应该显示为:{ "data": 23 }

这里是转换器中的marshal方法:

@Override
public void marshal(Object o, HierarchicalStreamWriter writer, MarshallingContext mc) {
    ArrayList<HashMap<String, Object>> src = (ArrayList<HashMap<String, Object>>) o;
    for(HashMap<String, Object> row : src) {
        writer.startNode("row");
        Iterator<String> it = row.keySet().iterator();
        while (it.hasNext()) {
            String key = it.next();
            writer.startNode(key);
            writer.setValue(row.get(key).toString());
            writer.endNode();
        }
        writer.endNode();
    }
}

谁能帮我解决这个问题?

【问题讨论】:

    标签: java json integer converter xstream


    【解决方案1】:

    显然你不应该使用toString(),因为你没有给 JSON 任何不是字符串的东西,所以你得到你做的结果也就不足为奇了。

     Object o = row.get(key);
     if (o instanceof Integer) {
       writer.setValue((Integer)o)
     } else {
       writer.setValue(o.toString())  
     }
    

    这现在将支持Integer 类型,其他任何类型都是String。为您想要支持的所有内容添加更多子句。

    还请注意,您可以使用以下方式迭代地图,这应该更方便:

      for(Entry<String, Object) e : map.entrySet())
    

    【讨论】:

    • 幸运的是 writer.setValue 方法只接受字符串。
    • 我不熟悉您为此使用的技术,所以我不知道,但我不得不猜测,有某种方法可以指定预期的类型,以便事情将它们写出来然后将字符串转换回原始类型。如果没有,可能没有办法做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    相关资源
    最近更新 更多