【问题标题】:List<Map<String,Object>> to org.json.JSONObject?List<Map<String,Object>> 到 org.json.JSONObject?
【发布时间】:2010-10-05 11:45:37
【问题描述】:
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}

【问题讨论】:

    标签: java json javabeans map


    【解决方案1】:

    如果您使用的是 org.json.simple.JSONArray

    (https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple/1.1.1)

    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);
    
    JSONArray jsonArray = new JSONArray();
    jsonArray.addAll(listOfMaps);
    

    【讨论】:

      【解决方案2】:

      您可以同时使用这两种方法:

      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();
      }
      

      【讨论】:

        【解决方案3】:
        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

        【讨论】:

        • 现在是 12 年,我正在寻找答案 :) 我正在考虑制作与此非常相似的东西(尤其是 HashMap 的 ArrayList),这对我们有很大帮助。
        【解决方案4】:

        这对我有用:

        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();
        }
        

        【讨论】:

          【解决方案5】:
          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();
          }
          

          【讨论】:

            【解决方案6】:

            您有一个嵌套在列表中的地图。您正在尝试调用 Map 而不先遍历列表。 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));
            }
            

            【讨论】:

              【解决方案7】:

              另外:您可以考虑使用 json.org 列表中的其他解析器之一:它们中的大多数允许您的 Json“对象”和“数组”本地映射到 java.util.Maps 和 java.util.Lists;或者在某些情况下也可以用于真正的 Java 对象。

              我的推荐是杰克逊,http://jackson.codehaus.org/Tutorial 它允许映射到 List/Map/Integer/String/Boolean/null,以及真正的 Beans/POJO。只需给它类型,它就会将数据映射给您,或者将 Java 对象写入 Json。 其他类似 berlios 的“json-tools”或 google-gson 也提供了类似的功能。

              【讨论】:

                【解决方案8】:

                您需要以 JSONObjects(地图)的 JSONArray(对应于 List)结束。

                尝试将 json 变量声明为 JSONArray 而不是 JSONObject(我相信 JSONArray 构造函数会做正确的事情)。

                【讨论】:

                • 如果有一个 JavaBean,其中包含一个包含 Map 元素的集合,我想 new JSONObject(myJavaBean) 会怎样?我试过了,不满意。
                猜你喜欢
                • 2018-09-22
                • 2020-08-01
                • 2021-04-29
                • 1970-01-01
                • 1970-01-01
                • 2020-01-26
                • 1970-01-01
                • 2018-04-26
                • 1970-01-01
                相关资源
                最近更新 更多