如何从这个Map数据构造一个JSON

时间:2014-08-20 12:34:17

标签: java

我有一个带有键和值的Map作为链接List,如下所示

{Ice creams=[Cone,KoolCool(21), Stick,KoolCool(25)]}

有了这个我需要构建一个跟随json

{
    "name": "Ice creams",
    "T2": [
        {
            "name": "Cone",
            "T3": [
                {
                    "name": "KoolCool",
                    "leaf": []
                }
            ]
        },
        {
            "name": "Stick",
            "T3": [
                {
                    "name": "KoolCool",
                    "leaf": []
                }
            ]
        }
    ]
}

每个逗号分隔值都会增加T值

我试图用下面的

来评价这个
  1. 对于Map中的每个键,将其值作为LinkedList
  2. 从LinkedList访问中拆分它并构造json
  3. 有人可以告诉我是否有更好的办法吗?

    package com.util;
    import java.util.LinkedHashMap;
    import java.util.LinkedList;
    import java.util.Map;
    public class Test {
        public static void main(String args[]) {
            Map<String, LinkedList<String>> consilatedMapMap = new LinkedHashMap<String, LinkedList<String>>();
            LinkedList<String> values = new LinkedList<String>();
            values.add("Cone,KoolCool(21)");
            values.add("Stick,KoolCool(25)");
            consilatedMapMap.put("Ice creams", values);
    
            /*
             * for (Map.Entry<String, LinkedList<String>> consilMap :
             * consilatedMapMap.entrySet()) {
             * 
             * String t1Category = consilMap.getKey(); LinkedList<String>
             * consiladatedList = consilMap.getValue();
             * 
             * 
             * for(int i=0;i<consiladatedList.size();i++) { String result =
             * consiladatedList.get(i);
             * 
             * String spliter[] = result.split(",");
             * 
             * for(int j=0;j<spliter.length;j++) { System.out.println(spliter[j]); }
             * 
             * }
             * 
             * }
             */
    
    
        }
    
    }
    

3 个答案:

答案 0 :(得分:1)

我相信你过度复杂了 - 自动增加的名称...... JSON结构与Java结构不匹配... JSON部分由对象结构生成,部分是通过解析其中的字符串...即使你说“每个逗号分隔值都会增加T值“从示例中显然不是这样。

尽管如此......这是可能的 - 即使只是使用org.json(不知道为什么人们继续建议将GSON作为修复所有这一切......)

这里的主要想法是为您需要生成的每个部分创建一个方法,并在需要时传递“级别”以生成适当的“Tn”属性。

public class Test {

    private static JSONObject processString(String data, int level) throws JSONException {
        JSONObject json = new JSONObject();
        int index = data.indexOf(',');
        String name = data;
        String remainder = "";
        if (index < 0) {
            index = name.indexOf('(');
            if (index > 0) {
                name = data.substring(0, index);
            }
        } else {
            name = data.substring(0, index);
            remainder = data.substring(name.length() + 1);
        }
        json.put("name", name);

        JSONArray a = new JSONArray();
        if (remainder.length() > 0) {
            a.put(processString(remainder, level + 1));
            json.put("T" + level, a);
        } else {
            json.put("leaf", a);
        }
        return json;
    }  

    private static JSONArray processList(List<String> list, int level) throws JSONException {
        JSONArray json = new JSONArray();
        for (String data : list) {
            json.put(processString(data, level));
        }
        return json;
    }  

    private static JSONObject processMap(Map<String>, List<String>> map, int level) throws JSONException {
        JSONObject json = new JSONObject();
        for (String key : map.keySet()) {
            json.put("name", key);
            json.put("T" + level, processList(map.get(key), level + 1));
        }
        return json;
    }        

    public static void main(String args[]) {
        Map<String, List<String>> consilatedMapMap = new LinkedHashMap<String, List<String>>();
        List<String> values = new LinkedList<String>();
        values.add("Cone,KoolCool(21)");
        values.add("Stick,KoolCool(25)");
        consilatedMapMap.put("Ice creams", values);

        try {
            int level = 2;
            JSONObject json = processMap(consilatedMapMap, level);
        } catch(JSONException x) {
            x.printStackTrace();
            System.exit(-1);
        }
}

答案 1 :(得分:0)

Google代码上有一个名为Gson的实用程序库。您可以查看here

有关简单示例,请访问this

答案 2 :(得分:0)

查看下面的代码:

     Map<String, LinkedList<String>> consilatedMapMap = new LinkedHashMap<String, LinkedList<String>>();
     LinkedList<String> values = new LinkedList<String>();
     values.add("Cone,KoolCool(21)");
     values.add("Stick,KoolCool(25)");
     consilatedMapMap.put("Ice creams", values);

     Gson gson=new Gson();
     String jsonElement=gson.toJson(consilatedMapMap);
    System.out.println(jsonElement);

<强>输出

{"Ice creams":["Cone,KoolCool(21)","Stick,KoolCool(25)"]}

从代码及其输出中可以看出,Gson库会将您的数据结构转换为json字符串。

您只需要this Gson图书馆。