2014-10-03 9 views
5

Ad esempio: dato questo documento JSON:lista di uscita di tutti i percorsi di nodi foglia in un documento JSON in java

{ 
    "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 
} 

Vorrei produrre (qualcosa di simile) questa uscita:

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 

Piuttosto che lavorare con il testo non elaborato, preferirei una soluzione efficiente basata su una delle robuste librerie json (gson, jackson, ecc.).

+0

una possibile soluzione potrebbe utilizzare JsonNode dalla libreria Jackson Jackson. JsonNode rootNode = mapper.readTree (fileReader); – Hector

+0

Se si utilizza un parser di streaming (come Jackson), è possibile mantenere una pila delle proprietà in cui ci si trova attualmente. quando colpisci un oggetto terminale (stringa, numero, booleano), emetti lo stack + il letterale. Potresti non aver nemmeno bisogno dello stack se usi getParsingContext. –

risposta

1

Si scopre che questo è abbastanza facile da fare con Gson, specialmente con il metodo JsonReader.getPath() introdotto in 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

Ecco un codice di esempio con org.json. Ma lo stesso può essere usato con Gson/Jackson con modifiche ai tipi appropriati all'interno di quelle librerie. Puoi anche usare StringBuilder invece di String per le chiavi qui.

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

Ottimo lavoro! hai salvato la mia giornata .... – SuReN

Problemi correlati