2009-02-04 19 views
11
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(); 
} 

Có gì sai với mã này?Danh sách <Map <String, Object >> đến org.json.JSONObject?

Đầu ra là:

{"empty": false} 

Trả lời

1

Bạn có một bản đồ lồng vào bên trong một danh sách. bạn đang cố gắng gọi Bản đồ mà không bao giờ lặp lại thông qua danh sách trước tiên. JSON đôi khi cảm thấy giống như ma thuật nhưng trên thực tế nó không phải là. Tôi sẽ đăng một số mã trong giây lát.
Sẽ phù hợp hơn với JSON để tạo Bản đồ bản đồ thay vì Danh sách bản đồ.

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

Bạn cần kết thúc bằng JSONArray (tương ứng với Danh sách) của JSONObjects (Bản đồ).

Hãy thử khai báo biến json dưới dạng JSONArray thay vì JSONObject (tôi tin rằng hàm tạo JSONArray sẽ làm điều đúng).

+0

Còn trường hợp JavaBean có chứa một bộ sưu tập chứa các phần tử Bản đồ và tôi muốn JSONObject mới (myJavaBean) là gì? Tôi đã cố gắng và không hài lòng. – yogman

1

Ngoài ra: bạn có thể xem xét sử dụng một trong các trình phân tích cú pháp khác từ danh sách của json.org: hầu hết trong số chúng cho phép đối tượng Json của bạn "" và "mảng" ánh xạ nguyên bản tới java.util.Maps và java.util.Lists; hoặc trong một số trường hợp đối với các đối tượng Java thực.

Đề xuất của tôi sẽ là Jackson, http://jackson.codehaus.org/Tutorial cho phép ánh xạ tới Danh sách/Bản đồ/Số nguyên/Chuỗi/Boolean/null, cũng như cho Đậu/POJO thực. Chỉ cần cung cấp cho nó loại và nó ánh xạ dữ liệu cho bạn, hoặc viết các đối tượng Java như là Json. Những người khác như "json-tools" từ berlios, hoặc google-gson cũng trưng ra chức năng tương tự.

1

này đã làm việc cho tôi:

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

Vui lòng viết nhận xét cho mã của bạn. – CSchulz

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

ổn, hãy thử này ~ này đã làm việc cho tôi: D

+2

It's '12 và tôi đang nhìn vào câu trả lời :) Tôi đang tìm kiếm một cái gì đó rất giống với điều này (đặc biệt là một ArrayList của HashMaps) và điều này đang giúp đỡ đáng kể. –

0

Bạn có thể làm điều đó bằng cả hai:

JSONArray trực tiếp as,

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

Hoặc bằng cách lặp lại danh sách với Java8 (như giải pháp @ShadowJohn):

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

Nếu bạn đang sử dụng 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); 
Các vấn đề liên quan