如何将List<Map<String,Object>>转换为org.json.JSONObject?

17
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> map = new HashMap<String, Object>();

map.put("abc", "123456");
map.put("def", "hmm");
list.add(map);
JSONObject json = new JSONObject(list);
try {
    System.err.println(json.toString(2));
} catch (JSONException e) {
    e.printStackTrace();
}
这段代码有什么问题?
输出结果为:
{"empty": false}
8个回答

25
public String listmap_to_json_string(List<Map<String, Object>> list)
{       
    JSONArray json_arr=new JSONArray();
    for (Map<String, Object> map : list) {
        JSONObject json_obj=new JSONObject();
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            String key = entry.getKey();
            Object value = entry.getValue();
            try {
                json_obj.put(key,value);
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }                           
        }
        json_arr.put(json_obj);
    }
    return json_arr.toString();
}

好的,试试这个~ 这对我有用 :D


2
现在是12点,我正在看答案 :) 我正试图制作与此非常相似的东西(特别是一个HashMap的ArrayList),这对我有很大帮助。 - user1499731

4
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> map = new HashMap<String, Object>();

map.put("abc", "123456");
map.put("def", "hmm");
list.add(map);
// it's wrong JSONObject json = new JSONObject(list);
// if u use list to add data u must be use JSONArray

JSONArray json = JSONArray.fromObject(list);
try {
    System.err.println(json.toString(2));
} catch (JSONException e) {
    e.printStackTrace();
}

3
你需要得到一个JSONArray(对应List)中的JSONObjects(Map),尝试将json变量声明为JSONArray而不是JSONObject(我相信JSONArray构造函数会做正确的事情)。

如果有一个包含Map元素的集合的JavaBean,我想用new JSONObject(myJavaBean)创建一个新的JSONObject对象,这种情况怎么办?我尝试过但不满意。 - yogman

2
另外,您可以考虑使用json.org列表中的其他解析器之一:它们大多数允许您的Json“对象”和“数组”直接映射到java.util.Maps和java.util.Lists;或者在某些情况下还可以映射到真正的Java对象。
我推荐使用Jackson,http://jackson.codehaus.org/Tutorial,它允许映射到List/Map/Integer/String/Boolean/null,以及真正的Beans/POJOs。只需给出类型,它就会将数据映射给您,或将Java对象写入Json。其他类似于berlios的“json-tools”或google-gson也提供类似的功能。

1

这对我有用:

List<JSONObject> jsonCategories = new ArrayList<JSONObject>();

JSONObject jsonCategory = null;

for (ICategory category : categories) {
    jsonCategory = new JSONObject();
    jsonCategory.put("categoryID", category.getCategoryID());
    jsonCategory.put("desc", category.getDesc());
    jsonCategories.add(jsonCategory);
}
try {
    PrintWriter out = response.getWriter();
    response.setContentType("text/xml");
    response.setHeader("Cache-Control", "no-cache");
    _log.info(jsonCategories.toString());
    out.write(jsonCategories.toString());

} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

1

你有一个嵌套在列表中的地图。你试图在先不迭代列表的情况下调用地图。JSON有时感觉像魔法,但实际上并不是。
我马上会发布一些代码。
与JSON更一致的做法是将地图制作成地图而不是地图列表。

JSONObject json = new JSONObject(list);
Iterator<?> it = json.keys();
while (keyed.hasNext()) {
    String x = (String) it.next();
    JSONObject jo2 = new JSONObject(jo.optString(x));
}

1

0

你可以使用以下两种方式实现:

直接使用 JSONArray,如下所示:

String toJson(Collection<Map<String, Object>> list)
{       
    return new JSONArray(list).toString();
}

或者通过使用Java8迭代列表(例如@ShadowJohn的解决方案):

String toJson(Collection<Map<String, Object>> list)
{       
    return new JSONArray( 
            list.stream()
                .map((map) -> new JSONObject(map))
            .collect(Collectors.toList()))
        .toString();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接