2009-02-04 17 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(); 
} 

इस कोड के साथ क्या गलत है?सूची <मानचित्र <स्ट्रिंग, ऑब्जेक्ट >> org.json.JSONObject पर?

उत्पादन होता है:

{"empty": false} 

उत्तर

1

आप एक नक्शे के एक सूची के अंदर नेस्टेड है। आप पहले सूची के माध्यम से बिना किसी पुनरावृत्ति के मानचित्र को कॉल करने का प्रयास कर रहे हैं। जेएसओएन कभी-कभी जादू की तरह महसूस करता है लेकिन असल में यह नहीं है। मैं एक पल में कुछ कोड पोस्ट करूंगा।
मैप्स की सूची के बजाय मानचित्र का नक्शा बनाने के लिए जेएसओएन के साथ यह अधिक संगत होगा।

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

आप JSONObjects के JSONArray (सूची के लिए इसी) (नक्शा) के साथ खत्म करने की जरूरत है।

JSONObject के बजाय जेसन वैरिएबल को JSONArray के रूप में घोषित करने का प्रयास करें (मुझे विश्वास है कि JSONArray कन्स्ट्रक्टर सही काम करेगा)।

+0

ऐसे मामले के बारे में क्या है जहां जावाबीन है, जिसमें एक संग्रह है जिसमें मानचित्र तत्व हैं, और मैं नया JSONObject (myJavaBean) चाहता हूं? मैंने कोशिश की और संतुष्ट नहीं था। – yogman

1

इसके अलावा: आप json.org की सूची से अन्य पार्सर्स में से किसी एक का उपयोग करने पर विचार कर सकते हैं: उनमें से अधिकतर आपके जेसन "ऑब्जेक्ट्स" और "एरे" को java.util.Maps और java.util.Lists पर मूल रूप से मैप करने की अनुमति देते हैं; या कुछ मामलों में असली जावा ऑब्जेक्ट्स भी।

मेरी सिफारिश जैक्सन, http://jackson.codehaus.org/Tutorial होगी जो सूची/मानचित्र/इंटीजर/स्ट्रिंग/बूलियन/नल के साथ-साथ वास्तविक बीन्स/पीओजेओ को मैप करने की अनुमति देती है। बस इसे टाइप करें और यह आपको डेटा दिखाता है, या जावा ऑब्जेक्ट्स जेसन के रूप में लिखता है। बेरिलोस से "जेसन-टूल्स" जैसे अन्य, या 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(); 
} 
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

कृपया अपने कोड पर एक टिप्पणी लिखें। – 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(); 
} 

ठीक, इस कोशिश ~ यह मेरे लिए काम किया: डी

+2

यह '12 है और मैं जवाब देख रहा हूं :) मैं इस तरह से कुछ ऐसा करने के लिए देख रहा हूं (विशेष रूप से हैश मैप्स का एक ऐरेलिस्ट) और यह काफी मदद कर रहा है। –

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(); 
} 
संबंधित मुद्दे