2010-03-22 7 views
15

क्या कोई जावा पुस्तकालय जानता है जो आसानी से जावा मैप्स को जेसन ऑब्जेक्ट्स और अन्य तरीकों से एन्कोड कर सकता है?जेसन से java.util.Map तक एन्कोड/डीकोड करने के लिए लाइब्रेरी?

अद्यतन

कारणों की व्याख्या नहीं कर सकता है के लिए (और मैं कभी कभी नफरत) मैं अपने पर्यावरण पर जेनरिक का उपयोग नहीं कर सकते हैं।

क्या मुझे क्या करना कोशिश कर रहा हूँ कुछ इस तरह है:

Map a = new HashMap(); 
a.put("name", "Oscar"); 

Map b = new HashMap(); 
b.put("name", "MyBoss"); 
a.put("boss", b) ; 


List list = new ArrayList(); 
list.add(a); 
list.add(b); 


String json = toJson(list); 
// and create the json: 
/* 
    [ 
     { 
     "name":"Oscar", 
     "boss":{ 
       "name":"MyBoss" 
     } 
     }, 
     { 
      "name":"MyBoss" 
     } 
    ] 

    */ 

और नक्शे

List aList = (List) fromJson(jsonStirng); 
+0

भी देखें: http://stackoverflow.com/questions/338586/a-better-java-json-library –

+0

भी देखें http: // stackoverflow .com/प्रश्न/443499/जेसन-टू-मैप और http://stackoverflow.com/questions/1957406/generate-java-class-from-json और http://stackoverflow.com/questions/658936/is- कहीं नहीं -ए-लाइब्रेरी-टू-कन्वर्ट-जावा-पॉजोस-टू-एंड-से-जेसन-एंड-एक्सएमएल –

+0

@dma_k संदर्भ के लिए धन्यवाद। मुझे वास्तव में आखिरी की तरह कुछ चाहिए क्योंकि मुझे बीन से बांधने का मतलब नहीं था। – OscarRyz

उत्तर

14

JSON-Simple उपयोग करने के लिए अपेक्षाकृत आसान दिखता है (नीचे उदाहरण)।

JSON करने के लिए नक्शा:

String s = yourJsonString; 
    List list = (JSONArray) JSONValue.parse(s);  
    Map map = (JSONObject) list.get(0); 
+0

इसने काम किया। मैं बीसन बाध्यकारी के लिए बेहतर जीसन पसंद करता हूं लेकिन दुर्भाग्य से मेरे पर्यावरण में मैं जेनिक्स का उपयोग नहीं कर सकता जिस पर जीसन भारी निर्भर करता है। जेएसओएन-सरल में थोड़ी सी बग है, हालांकि मुझे लगता है कि आसानी से हल किया जा सकता है: http://code.google.com/p/json-simple/issues/detail?id=18 मैं इसका उपयोग कर रहा हूं, लिंक के लिए धन्यवाद – OscarRyz

+0

इसके लायक होने के लिए, मुझे नहीं लगता कि आपको जीएसओएन के साथ भी जेनिक्स का उपयोग करना होगा - मुझे पूरा यकीन है कि यह भी काम करेगा। – StaxMan

+0

खोज के घंटों के बाद बहुत कुछ मुझे जवाब मिला –

1

हम में http://json-lib.sourceforge.net/ का उपयोग की एक सूची के रूप में फिर से यह करने में सक्षम हो हमारे परियोजना, यह ठीक काम करता है।

33

आप उस के लिए Google Gson उपयोग कर सकते हैं:

Map map = new HashMap(); 
    map.put("name", "foo"); 
    map.put("nickname", "bar"); 
    String jsonText = JSONValue.toJSONString(map); 

JSON/मानचित्र सूची में। Generic types के लिए इसका उत्कृष्ट समर्थन है।

यहाँ एक SSCCE है:

package com.stackoverflow.q2496494; 

import java.util.LinkedHashMap; 
import java.util.Map; 

import com.google.gson.Gson; 
import com.google.gson.reflect.TypeToken; 

public class Test { 

    public static void main(String... args) { 
     Map<String, String> map = new LinkedHashMap<String, String>(); 
     map.put("key1", "value1"); 
     map.put("key2", "value2"); 
     map.put("key3", "value3"); 
     Gson gson = new Gson(); 

     // Serialize. 
     String json = gson.toJson(map); 
     System.out.println(json); // {"key1":"value1","key2":"value2","key3":"value3"} 

     // Deserialize. 
     Map<String, String> map2 = gson.fromJson(json, new TypeToken<Map<String, String>>() {}.getType()); 
     System.out.println(map2); // {key1=value1, key2=value2, key3=value3} 
    } 

} 
+0

क्या गैर सामान्य मानचित्र को डीकोड (deserialize) करने का कोई तरीका है? – OscarRyz

+0

या तो 'मानचित्र <स्ट्रिंग, ऑब्जेक्ट>' या 'मानचित्र <ऑब्जेक्ट, ऑब्जेक्ट>' द्वारा 'मानचित्र <स्ट्रिंग, स्ट्रिंग>' को प्रतिस्थापित करें। या, अधिक ओओ-फ्रेंडली, बस एक पूर्ण योग्य जवाबीन का उपयोग करें। जीसन इसे पूरी तरह से संभाल सकता है। उदाहरण के लिए यह उत्तर देखें: http://stackoverflow.com/questions/1688099/converting-json-to-java/1688182#1688182 – BalusC

+0

समस्या यह है कि मैं ऐसे वातावरण का उपयोग कर रहा हूं जो जेनेरिक का समर्थन नहीं करता है, (erhmm। मुझसे मत पूछें कि कैसे या क्यों, मैं बस उनका उपयोग नहीं कर सकता) और जो मैं खोजने की कोशिश कर रहा हूं वह नक्शे की सादे सूचियों को जेसन में बदलने और उन्हें वापस लाने का एक तरीका है। – OscarRyz

4

आप जावा में अच्छा JSON पुस्तकालयों की सूची के लिए Json.org से साइट देख सकते हैं।

JSon.org का अपना implementationJSONObject बस ऐसा ही कर सकता है। उनके जावाडोक

/** 
    * Construct a JSONObject from a Map. 
    * 
    * @param map A map object that can be used to initialize the contents of 
    * the JSONObject. 
    */ 
    public JSONObject(Map map); 

से आप

JSONObject json = new JSONObject(map); 

करना JSON स्ट्रिंग वापस परिवर्तित करने के लिए कर सकते हैं आपत्ति उठाने ....

String jsonString = "{\"name\" : \"some name\", \"age\" : 10}"; 
JSONObject json = new JSONObject(jsonString); 

और आप जैसे मूल्यों पहुँच सकते हैं:

int age = json.getInt("age"); 

Constr यूक्टर जावाडॉसी

स्रोत JSON टेक्स्ट स्ट्रिंग से JSONObject का निर्माण करें। यह सबसे अधिक आमतौर पर JSONObject कन्स्ट्रक्टर का उपयोग किया जाता है।

पैरामीटर: स्रोत एक स्ट्रिंग { (बाएं ब्रेस) के साथ शुरुआत और } (दायां कोष्ठक) के साथ समाप्त।

+0

यह मानचित्र से जाता है -> JSONObject, लेकिन प्रश्नकर्ता दोनों दिशाओं चाहता है। – ThomasW

3

मुझे लगता है कि असली सवाल यह होगा कि जेएसओएन लाइब्रेरी (org.json के पृष्ठ से) ऐसा करने की अनुमति नहीं देगी।जहां तक ​​मुझे पता है कि प्रत्येक पुस्तकालय में कुछ रूपों में यह अनुमति होगी। तो अब तक वर्णित हर पुस्तकालय काम करता है।

और कुछ जानकारी जोड़ने के लिए, Jackson काम करता है बहुत अच्छी तरह से साथ मूल नक्शे और सूचियों सहित डेटा के सभी प्रकार:

ObjectMapper mapper = new ObjectMapper(); 
String json = mapper.writeValue(list); 
List listOfMaps = mapper.readValue(json, List.class); 

जो इस विशेष मामले को संभालने होगा। जबकि जेनेरिक प्रकार की जानकारी का उपयोग किया जा सकता है, यह जेडीके कंटेनर प्रकारों के लिए बाध्यकारी "प्राकृतिक" का उपयोग करते समय वैकल्पिक है।

0

Google जीसन का उपयोग करते समय।

var getRowData = 
[{ 
    "dayOfWeek": "Sun", 
    "date": "11-Mar-2012", 
    "los": "1", 
    "specialEvent": "", 
    "lrv": "0" 
}, 
{ 
    "dayOfWeek": "Mon", 
    "date": "", 
    "los": "2", 
    "specialEvent": "", 
    "lrv": "0.16" 
}]; 

    JsonElement root = new JsonParser().parse(request.getParameter("getRowData")); 
    JsonArray jsonArray = root.getAsJsonArray(); 
    JsonObject jsonObject1 = jsonArray.get(0).getAsJsonObject(); 
    String dayOfWeek = jsonObject1.get("dayOfWeek").toString(); 

// जैक्सन

का उपयोग करते समय
JsonFactory f = new JsonFactory(); 
       ObjectMapper mapper = new ObjectMapper(); 
      JsonParser jp = f.createJsonParser(getRowData); 
      // advance stream to START_ARRAY first: 
      jp.nextToken(); 
      // and then each time, advance to opening START_OBJECT 
     while (jp.nextToken() == JsonToken.START_OBJECT) { 
      Map<String,Object> userData = mapper.readValue(jp, Map.class); 
      userData.get("dayOfWeek"); 
      // process 
      // after binding, stream points to closing END_OBJECT 
     } 
+0

यदि आपको लगता है कि एक ही सटीक उत्तर एक से अधिक प्रश्नों पर लागू होता है, तो हो सकता है कि वे डुप्लिकेट हों और उन्हें ध्वजांकित किया जाना चाहिए, क्या आपको नहीं लगता? –

संबंधित मुद्दे