जावा ME में एक JSON स्ट्रिंग को ऑब्जेक्ट में बदलें?


116

क्या जावा / J2ME में स्ट्रिंग बदलने के लिए कोई तरीका है, जैसे:

{name:"MyNode", width:200, height:100}

कोड की एक पंक्ति में उसी का आंतरिक वस्तु प्रतिनिधित्व?

क्योंकि वर्तमान विधि बहुत थकाऊ है:

Object n = create("new");
setString(p, "name", "MyNode");
setInteger(p, "width", 200);
setInteger(p, "height", 100);

शायद एक JSON लाइब्रेरी?


6
आपका स्ट्रिंग वास्तव में एक JSON ऑब्जेक्ट नहीं है, Json मानक देखें ... यह जावास्क्रिप्ट संकेतन की तरह अधिक है।
फीलो

19
@ जेरेमी रुड: होना चाहिए{"name":"MyNode", "width":200, "height":100}
एस्तेबन कुबेर

1
@voyager: मुझे पता है, लेकिन जावास्क्रिप्ट मूल रूप से उद्धरण के बिना संपत्ति के नाम का समर्थन करता है।
TheFlash

1
@PhiLho: मुझे यह पता है, लेकिन मैंने इसे स्पष्टता के लिए इस तरह रखा। एसओ वाक्यविन्यास हाइलाइटर ने इसे गड़बड़ कर दिया होगा। लाल रंग में नाम और मूल्य।
फलाश

क्या जावा के कोर एपीआई का उपयोग करके रूपांतरण करने का कोई तरीका है? शायद जावा 8 में? जावा 9?
एलिकएल्ज़िन-किलाका

जवाबों:


108

मैंने उनमें से कुछ का उपयोग किया और मेरा पसंदीदा है,

http://code.google.com/p/json-simple/

पुस्तकालय बहुत छोटा है इसलिए यह J2ME के ​​लिए एकदम सही है।

आप JSON को जावा ऑब्जेक्ट में इस तरह से एक लाइन में पार्स कर सकते हैं,

JSONObject json = (JSONObject)new JSONParser().parse("{\"name\":\"MyNode\", \"width\":200, \"height\":100}");
System.out.println("name=" + json.get("name"));
System.out.println("width=" + json.get("width"));

1
क्या मैं इस लाइब्रेरी का उपयोग एप्लेट में कर सकता हूं। यदि यह परावर्तन का उपयोग करता है तो मैं एक परावर्तन त्रुटि के साथ सामना करने जा रहा हूँ। यह काम करेगा?
मृदंग अग्रवाल

क्या jsonSimple में अभी भी JSONParser वर्ग है? मैं क्लास नहीं बुला सकता।
फुलविन

JSONParser को अब हटा दिया गया है।
वर्धा एलेंट्री

79

सबसे सरल विकल्प जैक्सन है :

MyObject ob = new ObjectMapper().readValue(jsonString, MyObject.class);

पुस्तकालयों का उपयोग करने के लिए अन्य समान रूप से सरल हैं (Gson पहले ही उल्लेख किया गया था); लेकिन कुछ विकल्प अधिक श्रमसाध्य होते हैं, जैसे कि ओरिजिनल ओर्गन.जॉन लाइब्रेरी, जिसके लिए आपको मध्यवर्ती "JSONObject" बनाने की आवश्यकता होती है, भले ही आपको उन लोगों की कोई आवश्यकता न हो।


जैक्सन
skue

सच है, अगर j2me अभी भी लगभग JDK 1.4 के स्तर पर है (जैक्सन को 1.5 की आवश्यकता है)
StaxMan

1
आपने केवल 2 अपटिक्स प्राप्त किए हैं, लेकिन अधिक योग्य हैं। जैक्सन वास्तव में हमारे ऐप के लिए प्लगइन करना आसान था। सिफारिश करने के लिए धन्यवाद।
डैन डॉयोन

1
जैक्सन भी एक सादे वस्तु के लिए deserialize कर सकते हैं। जैसे। Object obj = new ObjectMapper().readValue("[1, 2, 3]", Object.class);
neoneye

जैक्सन का उपयोग कर अधिक कोड उदाहरण: mkyong.com/java/how-to-convert-java-object-to-from-json-jackson
cellepo

61

GS ऑब्जेक्ट को java object को json object और vise versa में कन्वर्ट करने का एक अच्छा विकल्प है।
यह google द्वारा प्रदान किया गया एक टूल है।

java को java ऑब्जेक्ट के उपयोग में fromJson(jsonObject,javaclassname.class)
बदलने के लिए : java ऑब्जेक्ट को json ऑब्जेक्ट के उपयोग में परिवर्तित करने के लिए: toJson(javaObject)
और बाकी चीजें अपने आप हो जाएंगी

अधिक जानकारी के लिए और डाउनलोड के लिए


1
+1 मैं कुछ इसी तरह की तलाश में था और यह बिल पूरी तरह से फिट बैठता है!
रॉय टैंग

23

इसे आप Google GSON के साथ आसानी से कर सकते हैं।

मान लें कि आपके पास उपयोगकर्ता, फ़ील्ड, और ऊँचाई के साथ उपयोगकर्ता नामक एक वर्ग है और आप निम्न जोंस स्ट्रिंग को उपयोगकर्ता ऑब्जेक्ट में बदलना चाहते हैं।

{"name":"MyNode", "width":200, "height":100}

आप आसानी से ऐसा कर सकते हैं, बिना डाले (निम्फक की टिप्पणी को ध्यान में रखते हुए;)), निम्नलिखित कोड के साथ:

Gson gson = new Gson(); 
final User user = gson.fromJson(jsonString, User.class);

जहाँ JSONString उपरोक्त JSON स्ट्रिंग है।

अधिक जानकारी के लिए, कृपया https://code.google.com/p/google-gson/ पर देखें


3
और हां, मुझे एहसास है कि सवाल 4 साल पहले पूछा गया था, लेकिन मेरा जवाब वर्तमान में ऐसा करने के इच्छुक पार्टियों के लिए है :) उम्मीद है कि यह किसी की मदद करता है!
सूफिनवाज़

22

आपके पास जावा के लिए कई JSON पार्सर हैं :

  • JSONObject.java
    एक JSONObject नाम / मान जोड़े का एक अनियोजित संग्रह है। इसका बाहरी रूप नामों और मूल्यों के बीच कॉलोनों के साथ घुंघराले ब्रेसिज़ में लिपटे एक स्ट्रिंग है, और मूल्यों और नामों के बीच अल्पविराम है। आंतरिक रूप एक वस्तु है जिसे नाम से मान प्राप्त करने के लिए () और विकल्प () विधियाँ प्राप्त होती हैं, और नाम से मान जोड़ने या बदलने के लिए पुट () विधियाँ आती हैं। मान इनमें से किसी भी प्रकार के हो सकते हैं: बूलियन, JSONArray, JSONObject, संख्या और स्ट्रिंग या JSONObject.NULL ऑब्जेक्ट।

  • JSONArray.java
    एक JSONArray मूल्यों का एक क्रमबद्ध क्रम है। इसका बाहरी रूप मानों के बीच अल्पविरामों के साथ वर्गाकार कोष्ठकों में लिपटा एक तार है। आंतरिक रूप एक ऑब्जेक्ट है जिसमें इंडेक्स द्वारा मानों को एक्सेस करने के लिए () और ऑप्ट () तरीके, और मानों को जोड़ने या बदलने के लिए पुट () तरीके हैं। मान इनमें से किसी भी प्रकार के हो सकते हैं: बूलियन, JSONArray, JSONObject, संख्या, और स्ट्रिंग, या JSONObject.NULL ऑब्जेक्ट।

  • JSONStringer.java
    एक JSONStringer तेजी से JSON पाठ के निर्माण के लिए एक उपकरण है।

  • JSONWriter.java
    एक JSONWriter तेजी से JSON टेक्स्ट को स्ट्रीम लिखने के लिए एक उपकरण है।

  • JSONTokener.java
    एक JSONTokener एक स्रोत स्ट्रिंग लेता है और उसमें से वर्ण और टोकन निकालता है। इसका उपयोग JSONObject और JSONArray कंस्ट्रक्टर द्वारा JSON स्रोत स्ट्रिंग्स को पार्स करने के लिए किया जाता है।

  • JSONException.java
    एक वाक्यविन्यास या प्रक्रियात्मक त्रुटि का पता चलने पर JSONException को फेंक दिया जाता है।

  • JSONString.java
    JSONString एक इंटरफ़ेस है जो कक्षाओं को अपने JSON क्रमांकन को लागू करने की अनुमति देता है।


1
अगर J2ME में java.io.IOException है; java.io.Writer; java.lang.reflect.Field; java.lang.reflect.Modifier; java.lang.reflect.Method; java.util.Collection; java.util.HashMap; java.util.Iterator; java.util.Map; java.util.TreeSet ;, फिर आप पहले वाले का उपयोग कर सकते हैं, क्योंकि वे सरल javaवर्ग हैं।
एस्टेबन कुबेर

2
मुझे लगता है कि MIDP 2.0 में कोई java.lang.reflect पैकेज नहीं है। जेनेरिक पार्सर बनाने के लिए कड़ी मेहनत करेंगे ...
फील्हो सेप

2
स्मार्ट आदमी, वॉयेजर, आपने अभी-अभी मानक जावा JSON क्लासेस के प्रलेखन में कॉपी किया है।
21

@ जेरेमी रुड: निश्चित रूप से मैंने किया, आपने कैसे सोचा कि मैंने इसे इतनी तेजी से किया है? यह आपको लिंक और कॉपी करने के लिए इसके मानक अभ्यास को ट्रोल करने का प्रयास नहीं था। मुझे खेद है अगर यह इस तरह से सामने आया।
एस्टेबन कुबेर 8'09

10
मैंने इसे अस्वीकार कर दिया क्योंकि यह प्रश्न का उत्तर नहीं देता है। इसके संबंधित वर्गों की एक सूची दे रहा है, लेकिन उनमें से कोई भी वास्तव में यह नहीं चाहता है कि पूछने वाला क्या चाहता है।
जेफ मार्टिन

7

JSON की आधिकारिक साइट वह है जहाँ आपको देखना चाहिए। यह विभिन्न पुस्तकालयों को प्रदान करता है जिनका उपयोग जावा के साथ किया जा सकता है, मैंने व्यक्तिगत रूप से इस एक का उपयोग किया है, JSON-lib जो साइट में कार्य का कार्यान्वयन है, इसलिए इस पृष्ठ में इसकी समान कक्षा - विधियाँ आदि हैं ।

यदि आप html लिंक पर क्लिक करते हैं तो आप कुछ भी पा सकते हैं जो आप चाहते हैं।

संक्षेप में:

एक json ऑब्जेक्ट और एक json सरणी बनाने के लिए, कोड है:

JSONObject obj = new JSONObject();
obj.put("variable1", o1);
obj.put("variable2", o2);
JSONArray array = new JSONArray();
array.put(obj);

ओ 1, ओ 2, आदिम प्रकार (लंबे, इंट, बूलियन), स्ट्रिंग्स या एरे हो सकते हैं।

रिवर्स प्रक्रिया काफी सरल है, मेरा मतलब है कि स्ट्रिंग को जोंस ऑब्जेक्ट / एरे में परिवर्तित करना।

String myString;

JSONObject obj = new JSONObject(myString);

JSONArray array = new JSONArray(myString);

सही ढंग से पार्स करने के लिए आपको बस यह जानना होगा कि आप किसी सरणी या ऑब्जेक्ट को पार्स कर रहे हैं या नहीं।



5

पहले से ही कई लोगों की तरह, नीचे दिए गए JSON.simple का उपयोग करके ऐसा करने का एक सरल तरीका

import org.json.JSONObject;

String someJsonString = "{name:"MyNode", width:200, height:100}";
JSONObject jsonObj = new JSONObject(someJsonString);

और फिर JSON ऑब्जेक्ट से निपटने के लिए jsonObj का उपयोग करें। उदा। jsonObj.get ("नाम");

नीचे दिए गए लिंक के अनुसार, JSON.simple छोटी और बड़ी दोनों JSON फ़ाइलों के लिए निरंतर दक्षता दिखा रहा है

http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/


आपने लिखा कि आपके द्वारा पोस्ट किए गए सुझाव में से कई ने पहले ही कहा था। आपके उत्तर का सार क्या है?
dakab 5

1
@dakab आपकी टिप्पणियों के लिए धन्यवाद। इस प्रश्न का सार कोड की एक पंक्ति देना था जो उद्देश्य को पूरा करता है। और जब से ऐसा करने के लिए कई एप्स उपलब्ध हैं, मैं सिर्फ एपिस की दक्षता की तुलना के बारे में कुछ अतिरिक्त जानकारी देना चाहता था। तो इस उत्तर का सार जो मेरा मतलब था कि इस धागे में अन्य साथियों द्वारा उल्लिखित विभिन्न एपियों की क्षमता की तुलना के बारे में कोड + कुछ जानकारी देना था।
कृपज


3

यह एक पुराना प्रश्न है और उस समय json-simple ( https://code.google.com/p/json-simple/ ) एक अच्छा समाधान हो सकता है, लेकिन कृपया विचार करें कि प्रोजेक्ट थोड़ी देर के लिए सक्रिय नहीं लगता है!

मैं उस Gson का सुझाव देता हूं जिसे अब होस्ट किया गया है: https://github.com/google/gson

यदि प्रदर्शन आपकी समस्या है तो आप कुछ बेंचमार्क http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-sson/ पर नज़र डाल सकते हैं जो तुलना करते हैं।


2

इसके अलावा www.json.org आप भी उपयोग कर अपने खुद पार्सर लागू कर सकते हैं JavaCC और अपने personnal व्याकरण / स्कीमा मिलान। मेरे ब्लॉग पर इस नोट को देखें: http://plindenbaum.blogspot.com/2008/07/parsing-json-with-javacc-my-notebook.html


9
वाह। मुझे यकीन है कि यह आसान और मजेदार है।
फलाफ

6
बहुत बुरा हमारे पास "मजेदार" और "व्यावहारिक" बैज देने के लिए नहीं है :)
StaxMan

2

मैंने JSON को पार्स करने के लिए json.org का उपयोग करने वाली एक लाइब्रेरी लिखी है, लेकिन यह वास्तव में आपके लिए एक इंटरफ़ेस का प्रॉक्सी बनाएगा। कोड / JAR code.google.com पर है।

http://fixjures.googlecode.com/

मुझे नहीं पता कि यह J2ME पर काम करता है या नहीं। चूंकि यह प्रॉक्सी बनाने के लिए जावा रिफ्लेक्शन का उपयोग करता है, मैं सोच रहा हूं कि यह काम नहीं करेगा। इसके अलावा, इसे वर्तमान में Google संग्रह पर एक कठिन निर्भरता मिली है जिसे मैं निकालना चाहता हूं और यह संभवतः आपकी आवश्यकताओं के लिए बहुत भारी है, लेकिन यह आपको अपने JSON डेटा को उस तरीके से इंटरैक्ट करने की अनुमति देता है जिस तरीके से आप देख रहे हैं:

interface Foo {
    String getName();
    int getWidth();
    int getHeight();
}

Foo myFoo = Fixjure.of(Foo.class).from(JSONSource.newJsonString("{ name : \"foo name\" }")).create();
String name = myFoo.getName(); // name now .equals("foo name");

कमाल है, हालांकि मैं फू नहीं चाहता, सिर्फ मूल वस्तु।
21

2

बस निम्नलिखित Json स्ट्रिंग के साथ जावा में एक Json वस्तु बनाओ। अपने मामले में

{name:"MyNode", width:200, height:100}

यदि ऊपर आपकी Json स्ट्रिंग है, तो इसके साथ एक Json ऑब्जेक्ट बनाएं।

JsonString ="{name:"MyNode", width:200, height:100}";
JSONObject yourJsonObject = new JSONObject(JsonString);
System.out.println("name=" + yourJsonObject.getString("name"));
System.out.println("width=" + yourJsonObject.getString("width"));

2

जैक्सन बड़ी फ़ाइलों के लिए, GSON छोटे फ़ाइलों के लिए, और JSON.simple दोनों से निपटने के लिए।


1
यहाँ से @ थंगा की टिप्पणी का सबूत देने के लिए ब्लॉग .akipi.com/
Gob00st

मैंने देखा है कि पहले भी, लेकिन यह भी विचार करें कि छोटी फाइलें वैसे भी पार्स करने के लिए तेज़ हैं। मैं केवल JSON.simple के बारे में सोचूंगा यदि आपके पास पार्स करने के लिए छोटी फ़ाइलों का एक टन है जहां जैक्सन पर 30% या इतना अंतर जोड़ना है। शीर्ष टिप्पणियां भी देखें, हो सकता है कि बेंचमार्क बहुत विश्वसनीय न हो। वास्तव में, यदि गति आपके लिए महत्वपूर्ण है, तो आपको संभवतः डिजाइन करना चाहिए ताकि आप आसानी से कार्यान्वयन को बदलने के लिए एक पार्सर को इंजेक्ट कर सकें, और अपने स्वयं के बेंचमार्क परीक्षण कर सकें।
उपयोगकर्ता
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.