2011-07-22 8 views
25

में गतिशील "कुंजी" और "मान" के साथ एक JSON को पार्स करने के लिए जीएसओएन का उपयोग करना मैं वर्तमान में एक एंड्रॉइड प्रोजेक्ट पर काम कर रहा हूं जिसके लिए मुझे एक वेब सेवा शुरू करने की आवश्यकता है जो मुझे एक जेएसएस फाइल लौटाएगा। मैं सभी जेसन फ़ाइल को पार्स करने और JSON ऑब्जेक्ट प्राप्त करने के लिए जीएसओएन लाइब्रेरी का उपयोग कर रहा हूं। यह तब तक अच्छा काम कर रहा है जब तक कि मैं इस जेसन डेटा में नहीं आ जाता जो मुख्य फ़ील्ड गतिशील होते हैं।एंड्रॉइड

{ "0": { "count":"5"}, 
    "1": { "title":"...", "desc":"" }, 
    "2": { "title":"...", "desc":"" }, 
    "3": { "title":"...", "desc":"" }, 
    "4": { "title":"...", "desc":"" }, 
    "5": { "title":"...", "desc":"" }, 
    "routes": { "route1":"...", "route3":"" }, 
} 

मैं "0" के प्रमुख आईडी के आधार पर गिनती प्राप्त करने में सक्षम हूँ, लेकिन मुझे यकीन है कि कैसे मैं इस मूल्य का उपयोग अन्य प्राप्त करने के लिए कर सकता हूँ नहीं कर रहा हूँ: इस फाइल का एक उदाहरण नीचे के रूप में है मुख्य ऑब्जेक्ट्स (कुंजी आईडी 1-5), जिसमें मुझे आवश्यक डेटा शामिल है। अगर कोई इस मामले में मेरी मदद करने में सक्षम है तो वास्तव में सराहना करेगा। धन्यवाद।

+0

मैं यह जोड़ना चाहता हूं कि यदि आपका नक्शा चीजों से घोंसला नहीं है तो बहुत आसान है http://stackoverflow.com/questions/2779251/ How-can-i-convert-json-to-a-hashmap-use-gson –

उत्तर

30

सबसे सरल दृष्टिकोण मैं सोच सकता हूं कि संरचना को केवल Map (Map)।

जीसन के साथ, यह अपेक्षाकृत आसान है, जब तक Map संरचना स्थैतिक रूप से ज्ञात है, रूट की प्रत्येक शाखा में समान गहराई है, और सब कुछ String है।

import java.io.FileReader; 
import java.lang.reflect.Type; 
import java.util.Map; 

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

public class GsonFoo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    Gson gson = new Gson(); 
    Type mapType = new TypeToken<Map<String,Map<String, String>>>() {}.getType(); 
    Map<String,Map<String, String>> map = gson.fromJson(new FileReader("input.json"), mapType); 
    System.out.println(map); 

    // Get the count... 
    int count = Integer.parseInt(map.get("0").get("count")); 

    // Get each numbered entry... 
    for (int i = 1; i <= count; i++) 
    { 
     System.out.println("Entry " + i + ":"); 
     Map<String, String> numberedEntry = map.get(String.valueOf(i)); 
     for (String key : numberedEntry.keySet()) 
     System.out.printf("key=%s, value=%s\n", key, numberedEntry.get(key)); 
    } 

    // Get the routes... 
    Map<String, String> routes = map.get("routes"); 

    // Get each route... 
    System.out.println("Routes:"); 
    for (String key : routes.keySet()) 
     System.out.printf("key=%s, value=%s\n", key, routes.get(key)); 
    } 
} 

अधिक गतिशील Map संरचना से निपटने के लिए, मैं दृढ़ता से Jackson उपयोग करने के लिए स्विच करने का सुझाव देते हैं, Gson के बजाय, के रूप में जैक्सन बस कोड का एक सरल रेखा के साथ एक जावा Map में किसी भी मनमाने ढंग से जटिलता के किसी भी JSON ऑब्जेक्ट deserialize होगा, और यह स्वचालित रूप से आदिम मूल्यों के प्रकारों को बनाए रखेगा।

import java.io.File; 
import java.util.Map; 

import org.codehaus.jackson.map.ObjectMapper; 

public class JacksonFoo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    ObjectMapper mapper = new ObjectMapper(); 
    Map map = mapper.readValue(new File("input.json"), Map.class); 
    System.out.println(map); 
    } 
} 

इसे जीसन के साथ भी हासिल किया जा सकता है, लेकिन इसके लिए कोड की दर्जनों लाइनों की आवश्यकता होती है। (इसके अलावा, जीसन की अन्य कमियां हैं जो जैक्सन के लिए स्विचिंग को अच्छी तरह से लाती हैं।)

+0

हाय, आपके समाधान के लिए धन्यवाद! यह पूरी तरह से काम करता है। =) – Philip

+2

वर्तमान में जीसन में यह काम करता है: मानचित्र jsondata = g.fromJson (इंसान, Map.class); – Teddy

1

आप गिनती का उपयोग कर व्यक्तिगत कुंजी वस्तुओं को प्राप्त कर सकते हैं। तो आपको ऑब्जेक्ट "1" मिलेगा और फिर "शीर्षक" और "desc" ऑब्जेक्ट प्राप्त होगा, फिर ऑब्जेक्ट "2" इत्यादि।

+1

मैंने ब्रूस के समाधान का उपयोग करके मेरी समस्या हल कर ली है। फिर भी आपकी सहायता के लिए धन्यवाद। =) – Philip