使用jackson和java获取json文件包含的对象

使用jackson和java获取json文件包含的对象,java,json,jackson,Java,Json,Jackson,我有这样一个JSON文件: {"city":[ { "id":"c1", "name":"Paris", "population":2125851, "département":"075" }, { "id":"c2", "name":"Marseille", "population":797491, "département":"013" }],"person":[ {

我有这样一个JSON文件:

{"city":[  
  {  
     "id":"c1",
     "name":"Paris",
     "population":2125851,
     "département":"075"
  },
  {  
     "id":"c2",
     "name":"Marseille",
     "population":797491,
     "département":"013"
  }],"person":[  
  {  
     "id":"p1",
     "name":"Jules Verne",
     "born":"c6",
     "category":"cat3",
     "birthdate":"1828-02-08"
  },
  {  
     "id":"p2",
     "name":"René Coty",
     "born":"c11",
     "category":"cat2",
     "birthdate":"1882-03-20"
  }]}
JsonParser jParser = null;
            JsonFactory jfactory = new JsonFactory();
            jParser = jfactory.createJsonParser(new File("graph.gjson"));
            while (jParser.nextToken() != JsonToken.END_OBJECT) {

                  String fieldname = jParser.getCurrentName();
                  jParser.nextToken();
                  System.out.println(jParser.getText());
我需要提取对象的名称,所以我需要得到这里的“城市”和“人”。 我试过和jackson做类似的事情:

{"city":[  
  {  
     "id":"c1",
     "name":"Paris",
     "population":2125851,
     "département":"075"
  },
  {  
     "id":"c2",
     "name":"Marseille",
     "population":797491,
     "département":"013"
  }],"person":[  
  {  
     "id":"p1",
     "name":"Jules Verne",
     "born":"c6",
     "category":"cat3",
     "birthdate":"1828-02-08"
  },
  {  
     "id":"p2",
     "name":"René Coty",
     "born":"c11",
     "category":"cat2",
     "birthdate":"1882-03-20"
  }]}
JsonParser jParser = null;
            JsonFactory jfactory = new JsonFactory();
            jParser = jfactory.createJsonParser(new File("graph.gjson"));
            while (jParser.nextToken() != JsonToken.END_OBJECT) {

                  String fieldname = jParser.getCurrentName();
                  jParser.nextToken();
                  System.out.println(jParser.getText());

但是这不起作用,任何人都可以帮我吗?

将while循环条件更新为
while(jParser.nextToken()!=JsonToken.END\u数组)
这将允许您解析整个数组,而不仅仅是单个对象

更新解析所有内容的更通用解决方案

    JsonToken token = jParser.nextToken() ;
    while (token != null && token != JsonToken.END_OBJECT)
    {

        String fieldname = jParser.getCurrentName();
        if (fieldname != null)
        {
            token = jParser.nextToken();
            System.out.println(jParser.getText());
        }
        token = jParser.nextToken();
        if (token == JsonToken.END_OBJECT)
            token = jParser.nextToken();

    }

如果您不想将JSON强制转换为POJO,您可能想看看,只想从中提取一些值:

public static void main(String[] args) {
    final String json = ...;
    final List<String> personNames = JsonPath.read(json, "$.person[*].name");
    final List<String> cityNames = JsonPath.read(json, "$.city[*].name");

    System.out.println(personNames);
    System.out.println(cityNames);
}
publicstaticvoidmain(字符串[]args){
最后一个字符串json=。。。;
最终列表personNames=JsonPath.read(json,“$.person[*].name”);
最终列表cityNames=JsonPath.read(json,“$.city[*].name”);
System.out.println(人名);
System.out.println(cityNames);
}

我刚刚找到了解决方案

Object obj;
                try {
                    obj = parser.parse(new FileReader(json));
                    JSONObject jsonObject = (JSONObject) obj;
                    Set<String> keys = jsonObject.keySet();
                    java.util.Iterator<String> key= keys.iterator();
                    while(key.hasNext())
                    {    Object element = key.next();
                        System.out.println(element);
                    }



                } catch (IOException | org.json.simple.parser.ParseException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
objectobj;
试一试{
obj=parser.parse(新文件读取器(json));
JSONObject JSONObject=(JSONObject)对象;
Set keys=jsonObject.keySet();
java.util.Iterator key=keys.Iterator();
while(key.hasNext())
{Object element=key.next();
系统输出打印项次(元素);
}
}catch(IOException | org.json.simple.parser.ParseException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}

我想与大家分享它,供那些像我一样搜索同一事物的人使用,因此这里的输出将是对象名称“keys”,即城市和个人。

它会产生什么错误?它只为我显示这个:城市{c1 Paris 2125851 075不要像那样解析它,而是使用jackson.library提供的方法。我看过那个教程,但我不需要将我的json转换为Pojoy。你不需要也不想?如果你想自己解析为文本文件,那么你需要一些样板代码。你的while循环条件没有正确地终止loop但这不会为我显示“城市”和“个人”:(这将提供文件中的所有内容)