【问题标题】:Parse JSON String into raw Java types using Jackson?使用 Jackson 将 JSON 字符串解析为原始 Java 类型?
【发布时间】:2013-12-25 02:45:33
【问题描述】:

我想解析一些 JSON 字符串,以最简单的方式表示数组或映射。我有整个 JSON 字符串,不需要流式传输。

我想做的是尽可能类似于此:

Object obj = parseJSON(theString);

然后 obj 将在哪里保存 Map 或 List 的实例(我无法提前知道哪个)。 JSON 对象可以与映射和数组任意嵌套,但所有类型都可以表示为基本 Java 类型:String、Integer、Double、Boolean 加上 Map 和 ArrayList,仅此而已。

到目前为止,我发现的所有简单示例都要求我知道类型是什么以及我想要哪些类型,但我想让所有这些都执行 JSON 解析器,因为我根本不会提前知道我得到了什么。

如果 Jackson 不是执行此操作的最佳库,我还能使用什么?

【问题讨论】:

  • 访问 json.org 并从大约 20 个用于 Java 的工具包中挑选一个。
  • (我看到很多 Java 人都在为简单的 JSON 问题而苦苦挣扎,因为他们都非常迷恋 Jackson 和它的克隆。)
  • 我非常迷恋杰克逊,这很痛苦。

标签: java json jackson


【解决方案1】:

愚蠢的问题,简单的答案:

import com.fasterxml.jackson.databind.ObjectMapper;
ObjectMapper mapper = new ObjectMapper();
Object obj = mapper.readValue(theString, Object.class);

这似乎正是我想要的。而且也很明显!

【讨论】:

    【解决方案2】:

    如果您决定放弃 Jackson(杰克逊很好,我在 JSON 战争中完全不可知论),另一个选择是 json-simple.

    JSONObject jObject = JSONValue.parse(String jsonString);
    

    由于 JSONObject 扩展了 java.util.HashMap 一切都应该工作。

    【讨论】:

    • 不,因为如果 JSON 字符串表示一个数组,我想要一个列表。正如我在发布几秒钟后发现的那样,readValue(theString, Object.class) 会这样做:如果 JSON 是一个数组,它会给我一个 ArrayList,如果 JSON 是一个地图,它会给我一个 LinkedHashMap。
    • 我想我的问题是“然后呢”?你有一个对象,要么是地图,要么是列表,但你能用它做什么?你会做一个instanceof吗?我想我不完全理解你的问题......
    【解决方案3】:

    您需要做的就是:

    ObjectMapper mapper = new ObjectMapper();
    Map<String,Object> map = mapper.readValue(theString, Map.class);
    

    我很确定这会返回一个 LinkedHashMap,如果你在乎的话。

    在我看来,你不会找到比 Jackson 更好的 Java JSON 序列化器/反序列化器。但是还有很多其他的,比如GSON。

    【讨论】:

    • 我一直在努力解决的问题是,我只看到了必须指定的示例,例如在您的示例中,Map 或 Array 或我自己的类型。我太傻了,看不到我实际上可以只指定 Object.class ,它会做我想要的。
    • 哦,是的,您也可以这样做。我以为您想明确说明使用Map。但是Object 有效。
    猜你喜欢
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    相关资源
    最近更新 更多