2017-01-09 37 views
0

我试图解析的JSON file text.json内容的JSON文件的方法。如何添加使用杰克逊库来解析Java中

我要的是做一个Java方法在下面的代码来获得它的所有键和值,但在我的代码,到目前为止,我只得到了第一个键和JSON文件的第一个值。

这里是我的Java类:

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

import org.codehaus.jackson.JsonFactory; 
import org.codehaus.jackson.JsonGenerationException; 
import org.codehaus.jackson.JsonNode; 
import org.codehaus.jackson.JsonParser; 
import org.codehaus.jackson.map.JsonMappingException; 
import org.codehaus.jackson.map.ObjectMapper; 

public class JacksonStreamExample { 
    public static void main(String[] args) { 
     try { 
      //Create a JsonFactory instance 
      JsonFactory factory = new JsonFactory(); 

      //Create a JsonParser instance to read from file c:\\text.json 
      JsonParser jParser = factory.createJsonParser(new File("c:\\text.json")); 

      /*Create an ObjectMapper instance to provide a pointer 
      * to root node of the tree after reading the JSON 
      */ 
      ObjectMapper mapper = new ObjectMapper(factory); 

      //Create tree from JSON 
      JsonNode rootNode = mapper.readTree(jParser); 

      Iterator<Map.Entry<String,JsonNode>> fieldsIterator = rootNode.getFields(); 
      while (fieldsIterator.hasNext()) { 
       Map.Entry<String,JsonNode> field = fieldsIterator.next(); 
       System.out.println("Key: " + field.getKey() + "\tValue:" + field.getValue()); 
      } 

      jParser.close(); 

     } catch (JsonGenerationException e) { 
      e.printStackTrace(); 
     } catch (JsonMappingException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

我的Eclipse的输出是只产生1对(键值)以下:

Key: cells Value:[{"type":"basic.Circle","size":{"width":90,"height":54},"position":{"x":-80,"y":200},"angle":0,"id":"cae4c219-c2cd-4a4b-b50c-0f269963ca24","embeds":"","z":1,"wi_name":"START","wi_displayName":"START","wi_description":"","wi_join":"<None>","wi_split":"<None>","wi_performingRole":"<None>","wi_expected_activity_time":null,"wi_expected_user_time":null,"wi_maximum_activity_time":null,"wi_initial_delay":null,"wi_time_unit":"Seconds","wi_required_transitions_for_AND_JOIN":null,"wi_custom_page":"","attrs":{"circle":{"fill":"#000000","width":50,"height":30,"stroke-width":1,"stroke-dasharray":"0"},"text":{"font-size":10,"text":"START","fill":"#ffffff","font-family":"Arial","stroke":"#000000","stroke-width":0,"font-weight":400}}},{"type":"basic.Circle","size":{"width":90,"height":54},"position":{"x":210,"y":200},"angle":0,"id":"d23133e0-e516-4f72-8127-292545d3d479","embeds":"","z":2,"wi_name":"END","wi_displayName":"END","wi_description":"","wi_join":"<None>","wi_split":"<None>","wi_performingRole":"<None>","wi_expected_activity_time":null,"wi_expected_user_time":null,"wi_maximum_activity_time":null,"wi_initial_delay":null,"wi_time_unit":"Seconds","wi_required_transitions_for_AND_JOIN":null,"wi_custom_page":"","attrs":{"circle":{"fill":"#000000","width":50,"height":30,"stroke-width":1,"stroke-dasharray":"0"},"text":{"font-size":10,"text":"END","fill":"#ffffff","font-family":"Arial","stroke":"#000000","stroke-width":0,"font-weight":400}}},{"type":"basic.Rect","position":{"x":-80,"y":370},"size":{"width":90,"height":54},"angle":0,"id":"a53898a5-c018-45c4-bd3f-4ea4d69f58ed","embeds":"","z":3,"wi_name":"ACTIVITY_1","wi_displayName":"ACTIVITY 1","wi_description":"","wi_join":"<None>","wi_split":"<None>","wi_performingRole":"<None>","wi_expected_activity_time":null,"wi_expected_user_time":null,"wi_maximum_activity_time":null,"wi_initial_delay":null,"wi_time_unit":"Seconds","wi_required_transitions_for_AND_JOIN":null,"wi_custom_page":"","attrs":{"rect":{"width":50,"height":30,"rx":2,"ry":2,"stroke-width":1,"stroke-dasharray":"0"},"text":{"text":"Activity","font-size":10,"font-family":"Arial","stroke":"#000000","stroke-width":0,"font-weight":400}}},{"type":"basic.Rect","position":{"x":220,"y":370},"size":{"width":90,"height":54},"angle":0,"id":"e2bd21f2-508d-44b9-9f68-e374d4fa87ea","embeds":"","z":4,"wi_name":"ACTIVITY_2","wi_displayName":"ACTIVITY 2","wi_description":"","wi_join":"<None>","wi_split":"<None>","wi_performingRole":"<None>","wi_expected_activity_time":null,"wi_expected_user_time":null,"wi_maximum_activity_time":null,"wi_initial_delay":null,"wi_time_unit":"Seconds","wi_required_transitions_for_AND_JOIN":null,"wi_custom_page":"","attrs":{"rect":{"width":50,"height":30,"rx":2,"ry":2,"stroke-width":1,"stroke-dasharray":"0"},"text":{"text":"Workitem","font-size":10,"font-family":"Arial","stroke":"#000000","stroke-width":0,"font-weight":400}}},{"type":"link","source":{"id":"cae4c219-c2cd-4a4b-b50c-0f269963ca24"},"target":{"id":"d23133e0-e516-4f72-8127-292545d3d479"},"router":{"name":"manhattan"},"labels":[{"position":0.5,"attrs":{"text":{"text":"Name"}}}],"id":"60ee7ff7-3a3b-487d-b581-49027e7bebe4","embeds":"","z":5,"attrs":{".marker-source":{"d":"M 10 0 L 0 5 L 10 10 z","transform":"scale(0.001)"},".marker-target":{"d":"M 10 0 L 0 5 L 10 10 z"},".connection":{"stroke":"black"}}},{"type":"link","source":{"id":"a53898a5-c018-45c4-bd3f-4ea4d69f58ed"},"target":{"id":"e2bd21f2-508d-44b9-9f68-e374d4fa87ea"},"router":{"name":"manhattan"},"labels":[{"position":0.5,"attrs":{"text":{"text":"Name"}}}],"id":"cea0d1c2-2c18-4bd7-ba35-d94918c6fc9b","embeds":"","z":6,"attrs":{".marker-source":{"d":"M 10 0 L 0 5 L 10 10 z","transform":"scale(0.001)"},".marker-target":{"d":"M 10 0 L 0 5 L 10 10 z"},".connection":{"stroke":"black"}}}] 

我将如何做到这一点吗?

+0

的可能的复制[如何在Java解析JSON(http://stackoverflow.com/questions/2591098/如何解析-JSON-in-java) –

+0

你是什么意思,完全由“所有键和值”?你的JSON例子是一个分层结构。你能提供一个单元测试来描述你期望的行为吗? – Gustave

+0

我希望能够遍历JSON数组和对象内的所有JSON,并获得所有的key-vaue对。我将如何在我的Java课程中做到这一点?我想念什么? –

回答

0

我改变JSON库解决我的问题。

我用json-simple-1.1.1

我是工作的最终代码如下:

package jsontoxml; 

import java.io.*; 

import org.json.simple.parser.JSONParser; 
import org.json.simple.*; 
import java.util.*; 


public class JacksonStreamExample { 

    public static void main(String[] args) { 
     JSONParser parser = new JSONParser(); 
    try { 
     Object obj = parser.parse(new FileReader("text.json")); 
     JSONObject jsonObject = (JSONObject) obj; 

     JSONArray cells = (JSONArray) jsonObject.get("cells"); 
     Iterator<JSONObject> iterator = cells.iterator(); 
     while(iterator.hasNext()){ 
      System.out.println(iterator.next()); 
     } 

    } catch (Exception e) { 

     e.printStackTrace(); 

    } 

    } 

} 
1

在上面的代码示例中,嵌套/等级结构不被认为是JSON值的和它直接打印它作为field.getValue()。

你必须使用

if(field.getValue().isObject()) 
{ 
    parse(field.getValue()) 
} 

Parse方法可以像然后如下

private void parse(JsonNode jsonNode) 
    { 
     Iterator<Map.Entry<String, JsonNode>> fieldsIterator = jsonNode.getFields(); 
     while (fieldsIterator.hasNext()) 
     { 
      Map.Entry<String, JsonNode> field = fieldsIterator.next(); 

      if (field.getValue().isObject()) 
      { 
       parse(field.getValue()); 
      } 

      System.out.println("Key: " + field.getKey() + "\tValue:" + field.getValue()); 
     } 
    } 

你只是呼吁根节点解析方法来检查值的类型。

+0

非常感谢你@Kaushik Patel。使用你的代码后,我的最终课程将如何? –

+0

不要忘记,我希望能够遍历JSON数组和对象内的所有JSON,并获得所有的key-vaue对。我将如何做到这一点? –

+0

用行解析(field.getValue())替换你的Iterator和While循环,并添加解析方法,如上所述 –