【问题标题】:Java decode JSONJava解码JSON
【发布时间】:2013-04-02 14:59:29
【问题描述】:

我正在尝试将 json 字符串解码为 Map。

我知道有很多这样的问题,但我需要非常具体的格式。例如,我有 json 字符串:

{
    "map": {
        "a": "b",
        "c": "d",
    },
    "map2": {
        "aa": "bb",
        "cc": "dd",
    },
    "something": "a",
    "something2": "b"
}

我需要得到如下结果:

"map.a" => "b"
"map.c" => "d"
"map2.aa" => "bb"
"map2.cc" => "dd"
"something" => "a"
"something2" => "b"

我确定键不会包含任何点。我看了几个JSON库,但我不需要这么多函数,只是为了解码和存储在Java地图中。如果没有简单的方法,我会为此编写自己的算法,我希望它不会那么难......

感谢您的帮助。

【问题讨论】:

  • 即使您使用自己的算法以点符号生成密钥,我仍然建议您使用解码器库。有太多可能导致严重错误的边缘情况,例如字符串转义规则。

标签: java json map


【解决方案1】:

我使用了org.codehaus.jackson。执行以下操作:

    HashMap<String, Object> content = null;
    HashMap<String, String> result = new HashMap<String, String>();

    try {
        JsonFactory factory = new JsonFactory();
        ObjectMapper mapper = new ObjectMapper(factory);
        TypeReference<HashMap<String, Object>> typeRef = new TypeReference<HashMap<String, Object>>() {
        };
        content = mapper.readValue(jsonString, typeRef);

    } catch (Exception ex) {
        System.out.println("Exception : " + ex);
    } 
    // now content has everything inside
    for(String s : content.keySet()){
        Object obj = content.get(s);
        if(obj instanceof String){
            result.put(s, (String)obj);
        } else {
            HashMap<String,String> hm = (HashMap<String,String>)obj;
            for(String s2: hm.keySet()){
                result.put(s+"."+s2, hm.get(s2));
            }

        }
    }

编辑:经过测试,可以正常工作

【讨论】:

  • 正是我需要的!谢谢! :)
【解决方案2】:

要准确解析 JSON,您需要为它定义一个合适的解析器,编写它们并不难,只是耗时。我的建议是找到一个相当轻量级的 JSON 解析器,然后为它编写一个装饰器以获取您正在寻找的地图格式。不过,如果您要处理大量 JSON,很遗憾,您会增加开销。

【讨论】:

    【解决方案3】:

    我认为您不会找到开箱即用的解决方案,因为这是一种非标准的表示。我的建议是使用 JSON 库将 JSON 字符串转换为 Java Map,然后对该 Map 进行深度优先遍历以将其转换为所需的表示形式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-20
      • 2013-05-10
      • 1970-01-01
      • 2015-01-15
      相关资源
      最近更新 更多