【问题标题】:Java wrapper class for JSON values that implements Map and List实现 Map 和 List 的 JSON 值的 Java 包装器类
【发布时间】:2014-12-12 17:54:52
【问题描述】:

是否有一个常用的库具有以类型安全的方式表示 json 的类?我正在寻找一个将 json 对象存储在 Map 中而 json 数组存储在 List 中的对象。

我想做的是这样的:

myJson.get("myInt").asInt();
myJson.get("myString").asString();

.get() 应该返回一个缺失的节点对象,因此不需要进行空检查。

Jackson 是一个非常好的库,可以完成所有这些工作,但是 Jackson JsonObject 和 JsonArray 类没有实现 Map 和 List。

【问题讨论】:

标签: java json jackson


【解决方案1】:

您必须将 JSON 转换为所需的类型。以下示例将其转换为 Map<String,String>。如果不能转换,就会抛出异常。

public class JsonMapExample {
    public static void main(String[] args) {

        String json = "{\"name\":\"mkyong\", \"age\":\"29\"}";

        Map<String,String> map = new HashMap<String,String>();
        ObjectMapper mapper = new ObjectMapper();

        try {       
            map = mapper.readValue(json, new TypeReference<HashMap<String,String>>(){});

        } catch (JsonMappingException e) {
            e.printStackTrace();
        }
    }
}

这通常是在通过网络发送序列化对象时发生的情况,在编组它时会失去类型安全性,然后通过解组将其重新添加到另一端。

见:

【讨论】:

  • 不回答问题。
  • @ccleve 请更详细地说明它如何不回答问题。我认为这是不可能的。我的观点是,没有办法让 JsonObject 或 JsonArray 成为类型安全的,JSON 是字符串序列化,因此本质上不是类型安全的,您可以通过编组到类型安全的类来解决它。顺便说一句,询问库建议是关闭问题的原因之一,我将向您展示如何使用您提到的库添加类型安全。
  • 很有可能。如果 Jackson 对象实现了 Map 和 List 接口,它们将满足标准。杰克逊也是类型安全的。如果您调用 node.asInt() 或 asText() 并且节点的类型不正确,它将为您进行转换。它还通过返回 MissingNode 来处理空值。
  • 他们可以实现 Map/List 接口,但我看不出这将如何帮助您获得类型安全,它们将是 Maps/Lists,您需要从中转换任何内容
  • 地图 地图;节点 node = map.get("foo");字符串 str = node.asString().
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
  • 2015-02-05
相关资源
最近更新 更多