2014-03-01 82 views
0

我想解析Java中的未知json輸入結構,如下面的格式,並試圖在另一個json中重寫相同的結構。在java中遞歸地解析遞歸未知的json輸入結構

同時,我需要在解析時驗證每個json鍵/值的每個&。

{"Verbs":[{ 
    "aaaa":"30d", "type":"ed", "rel":1.0, "id":"80", "spoken":"en", "ct":"on", "sps":null 
},{ 
    "aaaa":"31", "type":"cc", "rel":3.0, "id":"10", "spoken":"en", "ct":"off", "sps":null 
},{ 
    "aaaa":"81", "type":"nn", "rel":3.0, "id":"60", "spoken":"en", "ct":"on", "sps":null 
}]} 

請指教哪些json解析器可用於讀取和編寫未知的json內容。

+2

任何。它的json;他們解析它。 –

+0

如何解析每個json元素並將其重新組合成與輸入相同 – user3218475

+0

你想要對分析數據做什麼? –

回答

3

這樣,您就可以遞歸解析JSON對象:

import com.eclipsesource.json.JsonArray; 
import com.eclipsesource.json.JsonObject; 
import com.eclipsesource.json.JsonValue; 

public class JsonQuestion { 

    public static void main(String[] args) { 
     String input = "{\"Verbs\":[{\n" + 
       " \"aaaa\":\"30d\", \"type\":\"ed\", \"rel\":1.0, \"id\":\"80\", \"spoken\":\"en\", \"ct\":\"on\", \"sps\":null\n" + 
       "},{\n" + 
       " \"aaaa\":\"31\", \"type\":\"cc\", \"rel\":3.0, \"id\":\"10\", \"spoken\":\"en\", \"ct\":\"off\", \"sps\":null\n" + 
       "},{\n" + 
       " \"aaaa\":\"81\", \"type\":\"nn\", \"rel\":3.0, \"id\":\"60\", \"spoken\":\"en\", \"ct\":\"on\", \"sps\":null\n" + 
       "}]}"; 

     JsonObject jsonObject = JsonObject.readFrom(input); 
     handleObject(jsonObject); 
    } 

    private static void handleValue(JsonObject.Member member, JsonValue value) { 
     if (value.isArray()) { 
      if (member != null) { 
       System.out.print("name = " + member.getName()); 
      } 
      System.out.println("array value "); 
      recurseArray(value.asArray()); 
     } else if (value.isBoolean()) { 
      if (member != null) { 
       System.out.print("name = " + member.getName()); 
      } 
      System.out.println(", boolean value = " + value.asBoolean()); 
     } else if (value.isNull()) { 
      if (member != null) { 
       System.out.print("name = " + member.getName()); 
      } 
      System.out.println(", null value"); 
     } else if (value.isNumber()) { 
      if (member != null) { 
       System.out.print("name = " + member.getName()); 
      } 
      System.out.println(", number value = " + value.asDouble()); 
     } else if (value.isObject()) { 
      if (member != null) { 
       System.out.print("name = " + member.getName()); 
      } 
      System.out.println(", object value "); 
      handleObject(value.asObject()); 
     } else if (value.isString()) { 
      if (member != null) { 
       System.out.print("name = " + member.getName()); 
      } 
      System.out.println(", string value = " + value.asString()); 
     } 
    } 

    private static void handleObject(JsonObject object) { 
     for (JsonObject.Member next : object) { 
      JsonValue value = next.getValue(); 
      handleValue(next, value); 
     } 
    } 

    private static void recurseArray(JsonArray array) { 
     for (JsonValue value : array) { 
      handleValue(null, value); 
     } 
    } 
} 
+0

謝謝爲了您的答覆,Parallely可以在解析每個值時構造json響應。 – user3218475

+0

對不起,我不明白你的評論,這是問題嗎? –

+0

是的,我們可以在gson/jackson庫中實現相同的解析邏輯嗎?因爲我們只在我的項目中使用gson/jackson庫, – user3218475

-2

使用Jackson庫,你可以做到這一點,例如,以這樣的方式

ObjectMapper mapper = new ObjectMapper(); 
JsonNode rootNode = mapper.readTree(json); 
ArrayNode verbs = (ArrayNode) rootNode.get("Verbs"); 
int size = verbs.size(); 
for (int index = 0; index < size; index++) { 
    JsonNode itemNode = verbs.get(index); 
    System.out.println(itemNode); 
    System.out.println(itemNode.get("aaaa").asText()); 
    System.out.println(itemNode.get("type").asText()); 
    System.out.println(itemNode.get("rel").asInt()); 
    System.out.println(itemNode.get("id").asInt()); 
    //... 
} 
1

使用GSON庫 https://sites.google.com/site/gson/gson-user-guide

public void parseJson() { 
    String jsonStr = "";//nput json String. 
    JsonElement jsonElement = parser.parse(jsonStr); 
    processJsonElement(jsonElement); 
} 


private void processJsonElement(JsonElement e) { 
    if (e.isJsonArray()) { 
     processJsonArray(e.getAsJsonArray()); 
    } else if (e.isJsonNull()) { 
     processJsonNull(e.getAsJsonNull()); 
    } else if (e.isJsonObject()) { 
     processJsonObject(e.getAsJsonObject()); 
    } else if (e.isJsonPrimitive()) { 
     processJsonPrimitive(e.getAsJsonPrimitive()); 
    } 
} 

private void processJsonArray(JsonArray a) { 
    for (JsonElement e : a) { 
     processJsonElement(e); 
    } 
} 

private void processJsonNull(JsonNull n) { 
    System.out.println("null || : " + n); 
} 

private void processJsonObject(JsonObject o) { 
    Set<Map.Entry<String, JsonElement>> members= o.entrySet(); 
    for (Map.Entry<String, JsonElement> e : members) { 
     System.out.println("Processing object member: " + e.getKey()); 
     processJsonElement(e.getValue()); 
    } 
} 

private void processJsonPrimitive(JsonPrimitive p) { 
    System.out.println("Primitive || :" + p); 
} 

or Jackson

public void processJson() { 
    ObjectMapper objectMapper = new ObjectMapper(); 
    try { 
     JsonNode node = objectMapper.readTree(jsonStr); 
     System.out.println(node); 
     processNode(node); 
    } catch (IOException e) { 
     throw new RuntimeException(e); 
    } 

} 

private void processNode(JsonNode n) { 
    if (n.isContainerNode()) { 
     processJsonContainer(n.iterator()); 
    } else if (n.isNull()) { 
     System.out.println("Null || :" + n); 
    } else if (n.isNumber()) { 
     System.out.println("Number || :" + n.asDouble()); 
    } else if (n.isBoolean()) { 
     System.out.println("Boolean || :" + n.asBoolean()); 
    } else if (n.isTextual()) { 
     System.out.println("Text || :" + n.asText()); 
    } 
} 

private void processJsonContainer(Iterator<JsonNode> iterator) { 
    while (iterator.hasNext()) { 
     processNode(iterator.next()); 
    } 
}