2014-10-03 6 views
5

में उदाहरण के लिए के आउटपुट सूची:एक json दस्तावेज़ में पत्र-गांठ करने के लिए सभी रास्ते जावा

{ 
    "store": { 
     "book": [ 
      { 
       "category": "reference", 
       "author": "Nigel Rees", 
       "title": "Sayings of the Century", 
       "price": 8.95 
      }, 
      { 
       "category": "fiction", 
       "author": "Herman Melville", 
       "title": "Moby Dick", 
       "isbn": "0-553-21311-3", 
       "price": 8.99 
      }, 
     ], 
     "bicycle": { 
      "color": "red", 
      "price": 19.95 
     } 
    }, 
    "expensive": 10 
} 

मैं (जैसे कुछ) का उत्पादन करना चाहते हैं इस उत्पादन:

store.book.category: "reference" 
store.book.author: "Nigel Rees" 
store.book.title: "Sayings of the Century" 
store.book.price: 8.95 
store.book.category: "fiction" 
store.book.author: "Herman Melville" 
store.book.title: "Moby Dick" 
store.book.isbn: "0-553-21311-3" 
store.book.price: 8.99 
store.bicycle.color: "red" 
store.bicycle.price: 19.95 
expensive:10 
इस json दस्तावेज़ को देखते हुए

कच्चे पाठ से काम करने की बजाय, मैं एक मजबूत जेसन पुस्तकालयों (जीसन, जैक्सन, आदि) के आधार पर एक कुशल समाधान पसंद करूंगा।

+0

एक संभावित समाधान जैक्सन जेसन लाइब्रेरी से जेसननोड का उपयोग कर सकता है। JsonNode rootNode = mapper.readTree (fileReader); – Hector

+0

यदि आप एक स्ट्रीमिंग पार्सर (जैक्सन की तरह) का उपयोग करते हैं, तो आप वर्तमान में मौजूद संपत्तियों का ढेर बनाए रख सकते हैं। जब आप टर्मिनल ऑब्जेक्ट (स्ट्रिंग, संख्या, बूलियन) दबाते हैं, तो स्टैक + शाब्दिक आउटपुट करें। यदि आप getParsingContext का उपयोग करते हैं तो आपको स्टैक की भी आवश्यकता नहीं हो सकती है। –

उत्तर

1

बाहर निकलता है यह जीसन का उपयोग करना बहुत आसान है, खासकर जेसनआरडर.getपाथ() विधि 2.3 में पेश किया गया है।

static void parseJson(String json) throws IOException { 

    JsonReader reader = new JsonReader(new StringReader(json)); 
    reader.setLenient(true); 
    while (true) { 
     JsonToken token = reader.peek(); 
     switch (token) { 
      case BEGIN_ARRAY: 
       reader.beginArray(); 
       break; 
      case END_ARRAY: 
       reader.endArray(); 
       break; 
      case BEGIN_OBJECT: 
       reader.beginObject(); 
       break; 
      case END_OBJECT: 
       reader.endObject(); 
       break; 
      case NAME: 
       reader.nextName(); 
       break; 
      case STRING: 
       String s = reader.nextString(); 
       print(reader.getPath(), quote(s)); 
       break; 
      case NUMBER: 
       String n = reader.nextString(); 
       print(reader.getPath(), n); 
       break; 
      case BOOLEAN: 
       boolean b = reader.nextBoolean(); 
       print(reader.getPath(), b); 
       break; 
      case NULL: 
       reader.nextNull(); 
       break; 
      case END_DOCUMENT: 
       return; 
     } 
    } 
} 

static private void print(String path, Object value) { 
    path = path.substring(2); 
    path = PATTERN.matcher(path).replaceAll(""); 
    System.out.println(path + ": " + value); 
} 

static private String quote(String s) { 
    return new StringBuilder() 
      .append('"') 
      .append(s) 
      .append('"') 
      .toString(); 
} 

static final String REGEX = "\\[[0-9]+\\]"; 
static final Pattern PATTERN = Pattern.compile(REGEX); 
4

यहाँ org.json के साथ एक नमूना कोड है। लेकिन जीएसन/जैक्सन के साथ उन पुस्तकालयों के भीतर उचित प्रकार के परिवर्तनों के साथ इसका उपयोग किया जा सकता है। आप यहां कुंजी के लिए स्ट्रिंग के बजाय StringBuilder का उपयोग भी कर सकते हैं।

import java.util.Iterator; 
import org.json.JSONArray; 
import org.json.JSONObject; 

public class MyJSONTest { 

    private static void listJson(JSONObject json) { 
    listJSONObject("", json); 
    } 

    private static void listObject(String parent, Object data) { 
    if (data instanceof JSONObject) { 
     listJSONObject(parent, (JSONObject)data); 
    } else if (data instanceof JSONArray) { 
     listJSONArray(parent, (JSONArray) data); 
    } else { 
     listPrimitive(parent, data); 
    }  
    } 

    private static void listJSONObject(String parent, JSONObject json) { 
    Iterator it = json.keys(); 
    while (it.hasNext()) { 
     String key = (String)it.next(); 
     Object child = json.get(key); 
     String childKey = parent.isEmpty() ? key : parent + "." + key; 
     listObject(childKey, child); 
    } 
    } 

    private static void listJSONArray(String parent, JSONArray json) { 
    for (int i = 0; i < json.length(); i++) { 
     Object data = json.get(i); 
     listObject(parent + "[" + i + "]", data); 
    } 
    } 

    private static void listPrimitive(String parent, Object obj) { 
    System.out.println(parent + ":" + obj); 
    } 

    public static void main(String[] args) { 
    String data = "{\"store\":{\"book\":[{\"category\":\"reference\",\"author\":\"NigelRees\",\"title\":\"SayingsoftheCentury\",\"price\":8.95},{\"category\":\"fiction\",\"author\":\"HermanMelville\",\"title\":\"MobyDick\",\"isbn\":\"0-553-21311-3\",\"price\":8.99},],\"bicycle\":{\"color\":\"red\",\"price\":19.95}},\"expensive\":10}"; 
    JSONObject json = new JSONObject(data);  
    System.out.println(json.toString(2)); 
    listJson(json); 
    } 

} 
+0

महान काम! तुमने मेरा दिन बचा लिया .... – SuReN

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