2016-04-12 10 views
7

मेरे पास एक स्ट्रिंग है जो जेसन प्रारूप में है, केवल कुंजियों या मूल्यों में से कोई भी उद्धरण से घिरा हुआ नहीं है।मानचित्र में उद्धरण के बिना जेसन स्ट्रिंग को कनवर्ट करें

Map<String, Object> friend1Map = new HashMap<>(); 
friend1Map.put("name", "Dan"); 
friend1Map.put("age", 23); 

Map<String, Object> friend2Map = new Hashmap<>(); 
friend2Map.put("name", "Zane"); 
friend2Map.put("age", 24); 

Map<String, Object> newMap = new HashMap<>(); 
newMap.put("name", "Bob"); 
newMap.put("state", "Colorado"); 
newMap.put("Friends", Arrays.asList(friend1Map, friend2Map)); 

मैं कोशिश की है निम्नलिखित दो तरीकों:

ObjectMapper mapper = new ObjectMapper(); 
mapper.readValue(json, new TypeReference<Map<String, Object>>() {}); 

हो जाएगा ताकि

String json = "{name: Bob, state: Colorado, Friends: [{ name: Dan, age: 23 }, {name: Zane, age: 24 }]}" 

मैं इस एक नक्शा है कि इतनी की तरह लग रहा बनना चाहते हैं: उदाहरण के लिए, मैं इस राशि एक त्रुटि फेंक, कह रही है:

Unexpected character ('n'): was expecting double-quote to start field name 

तब मैं नक्शाकार की config बदल रहा है की कोशिश की:

mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); 
mapper.readValue(json, new TypeReference<Map<String, Object>>() {}); 

लेकिन यह कह एक त्रुटि फेंक दिया:

com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'Bob': was expecting ('true', 'false' or 'null') 
at [Source: {name: Bob, state: Colorado, Friends: [{ name: Dan, age: 23 }, {name: Zane, age: 24 }]}; line: 1, column: 11] 

वहाँ जब उद्धरण json स्ट्रिंग में शामिल नहीं हैं इस मानचित्र होने का कोई तरीका है?

+1

आपका जेसन स्ट्रिंग अमान्य है, इसे यहां जांचें: http://jsonlint.com –

+0

कैसा है? और स्पष्ट रूप से इस टिप्पणी को – user2869231

+0

जोड़ने के लिए 15 वर्णों की आवश्यकता है या इसके बजाय, मैं इसे वैध कैसे बनाऊंगा? स्पष्ट रूप से मुद्दा उद्धरण नहीं है। क्या मुझे कुछ बुरा विभाजन करना होगा? – user2869231

उत्तर

0

ऑब्जेक्टमैपर जेसन इनपुट को पार्स करने में सक्षम नहीं होगा अगर यह मान्य नहीं है, तो उत्तर नहीं है।

टेस्ट यहाँ Json: http://jsonlint.com/

Json इनपुट ठीक करने के बाद आप कर सकता है:

ObjectMapper ob = new ObjectMapper(); 
    ob.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); 
    String json = "{name: \"Bob\", state: \"Colorado\", Friends: [{ name: \"Dan\", age: 23 }, {name: \"Zane\", age: 24 }]}"; 

    Map<String, ObjectNode> theMap = ob.readValue(json, Map.class); 
    System.out.println(theMap.get("name")); 

प्रिंट होगा:

बॉब

+1

जैक्सन अवैध JSON पार्स कर सकते हैं। 'JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES' पर ध्यान दें। यह सिर्फ अनगिनत फ़ील्ड मानों का विश्लेषण नहीं कर सकता है (ऐसा लगता है)। – Savior

+0

आह जानना अच्छा है –

+0

इसके अलावा, आपके 'theMap' में केवल' स्ट्रिंग' मान नहीं होंगे। उस JSON में सरणी हैं। आपने जो प्रस्ताव दिया है वह सुरक्षित नहीं है। इसके बजाए 'ऑब्जेक्ट नोड' का प्रयोग करें। – Savior

1

अपने प्रश्न का उत्तर देने : एस नहीं है एएफ अपना JSON प्राप्त करने का तरीका - जो कि जेएसओएन नहीं है, क्योंकि यह अमान्य है - Map<String, Object> में परिवर्तित हो गया है।

मुझे सिर्फ एक छोटा सा विस्तृत करते हैं (कारण है कि यह सुरक्षित रूप से पार्स नहीं किया जा सकता है?): कल्पना कीजिए इस तरह एक "JSON":

{ 
    this is my key: and here's my value and it even has a colon: 
} 

मान्य JSON इस

{ 
    "this is my key": "and here's my value and it even has a colon:" 
} 
कुछ ऐसा दिखाई देगा

उद्धरण के साथ एक पार्सर सुरक्षित रूप से कुंजी और मूल्य निर्धारित कर सकता है। उनके बिना एक पार्सर खो गया है।

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