Java 尝试使用jackson流式api解析json

Java 尝试使用jackson流式api解析json,java,json,jackson,Java,Json,Jackson,我有这个json [{ "id":"1", "firstname":"X", "lastname":"y", "contactnumbers":["905123123"] },{ "id":"2", "firstname":"Jo", "lastname":"Be", "contactnumbers":["416888888", "951233333"] }] 我试图用下面的代码来解析它 if (jsonParser.nextToken() == Jso

我有这个json

[{
  "id":"1",
  "firstname":"X",
  "lastname":"y",
  "contactnumbers":["905123123"]
},{
  "id":"2",
  "firstname":"Jo",
  "lastname":"Be",
  "contactnumbers":["416888888", "951233333"]
}]
我试图用下面的代码来解析它

    if (jsonParser.nextToken() == JsonToken.START_ARRAY){
        if (jsonParser.nextToken() == JsonToken.START_OBJECT){
            c = new Person();
            while (jsonParser.nextToken() != JsonToken.END_OBJECT){
                if (jsonParser.getCurrentName().equals("id")){
                    c.setId(jsonParser.getValueAsString());
                    jsonParser.nextToken();
                } else if (jsonParser.getCurrentName().equals("firstname")){
                    c.setFirstName(jsonParser.getValueAsString());
                    jsonParser.nextToken();
                } else if (jsonParser.getCurrentName().equals("lastname")){
                    c.setLastName(jsonParser.getValueAsString());
                    jsonParser.nextToken();
                } else if (jsonParser.getCurrentName().equals("contactnumbers")){
                    List<String> s = new ArrayList<String>();
                    while (jsonParser.nextToken() != JsonToken.END_ARRAY){
                        s.add(jsonParser.nextValue().asString());
                    }
                }
            }
        }
        if (c != null) {
            personList.add(c);
        }
    }
if(jsonParser.nextToken()==JsonToken.START\u数组){
if(jsonParser.nextToken()==JsonToken.START\u对象){
c=新人();
while(jsonParser.nextToken()!=JsonToken.END\u对象){
if(jsonParser.getCurrentName().equals(“id”)){
c、 setId(jsonParser.getValueAsString());
jsonParser.nextToken();
}else if(jsonParser.getCurrentName().equals(“firstname”)){
c、 setFirstName(jsonParser.getValueAsString());
jsonParser.nextToken();
}else if(jsonParser.getCurrentName().equals(“lastname”)){
c、 setLastName(jsonParser.getValueAsString());
jsonParser.nextToken();
}else if(jsonParser.getCurrentName().equals(“ContactNumber”)){
列表s=新的ArrayList();
while(jsonParser.nextToken()!=JsonToken.END_数组){
s、 添加(jsonParser.nextValue().asString());
}
}
}
}
如果(c!=null){
添加(c);
}
}

但是很明显,即使是我最外层的
,如果没有执行。我不知道为什么

不是很好的代码,但它可以工作

Person.java:

package org.jackson.example;

import java.sql.Date;
import java.util.List;

public class Person {

    private String id;

    private String firstName;

    private String lastName;

    private List<String> contactNumbers;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public List<String> getContactNumbers() {
        return contactNumbers;
    }

    public void setContactNumbers(List<String> contactNumbers) {
        this.contactNumbers = contactNumbers;
    }

    @Override
    public String toString() {
        return "Person [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", contactNumbers="
                + contactNumbers + "]";
    }

}
package org.jackson.example;
导入java.sql.Date;
导入java.util.List;
公共阶层人士{
私有字符串id;
私有字符串名;
私有字符串lastName;
私人通讯录号码;
公共字符串getId(){
返回id;
}
公共无效集合id(字符串id){
this.id=id;
}
公共字符串getFirstName(){
返回名字;
}
public void setFirstName(字符串firstName){
this.firstName=firstName;
}
公共字符串getLastName(){
返回姓氏;
}
public void setLastName(字符串lastName){
this.lastName=lastName;
}
公共列表GetContactNumber(){
返回联系人号码;
}
公共无效设置联系人号码(列出联系人号码){
this.contactnumber=contactnumber;
}
@凌驾
公共字符串toString(){
return“Person[id=“+id+”,firstName=“+firstName+”,lastName=“+lastName+”,contactNumbers=”
+联系人号码+“]”;
}
}
StreamJacksonApi.java:

package org.jackson.example;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;

public class StreamJacksonApi {

    public static void main(String[] args) throws JsonParseException, IOException {
        List<Person> personList = new ArrayList<>();

        String content = "[{ \"id\":\"1\", \"firstname\":\"X\", \"lastname\":\"y\", \"contactnumbers\":[\"905123123\"] },{ \"id\":\"2\", \"firstname\":\"Jo\", \"lastname\":\"Be\", \"contactnumbers\":[\"416888888\", \"951233333\"] }]"; 
        JsonFactory jsonFactory = new JsonFactory();
        @SuppressWarnings("deprecation")
        JsonParser jsonParser = jsonFactory.createJsonParser(content); //Omit deprecation
        jsonParser.nextToken();
        while (jsonParser.nextToken() != JsonToken.END_ARRAY){
                final Person c = new Person();
                while (jsonParser.nextToken() != JsonToken.END_OBJECT){
                    if (jsonParser.getCurrentName().equals("id")){
                        c.setId(jsonParser.getValueAsString());
                    } else if (jsonParser.getCurrentName().equals("firstname")){
                        c.setFirstName(jsonParser.getValueAsString());
                    } else if (jsonParser.getCurrentName().equals("lastname")){
                        c.setLastName(jsonParser.getValueAsString());
                    } else if (jsonParser.getCurrentName().equals("contactnumbers")){
                        List<String> s = new ArrayList<String>();
                        while (jsonParser.nextToken() != JsonToken.END_ARRAY){
                            final String token = jsonParser.getValueAsString();
                            if(token != null) {
                                s.add(token);
                            }
                        }
                        c.setContactNumbers(s);
                    }
                }
                if (c != null) {
                    personList.add(c);
                }
            }

        for (Person person : personList) {
            System.out.println(person);
        }
    }


}
package org.jackson.example;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.List;
导入com.fasterxml.jackson.core.JsonFactory;
导入com.fasterxml.jackson.core.JsonParseException;
导入com.fasterxml.jackson.core.JsonParser;
导入com.fasterxml.jackson.core.JsonToken;
公营班级{
公共静态void main(字符串[]args)抛出JsonParseException、IOException{
List personList=新建ArrayList();
String content=“[{“id\”:“1\”,“firstname\”:“X\”,“lastname\”:“y\”,“contactnumbers\”:[\“905123123\”],{“id\”:“2\”,“firstname\”:“Jo\”,“lastname\”:“Be\,“contactnumbers\”:[\“41688888\”,“951233333\”];
JsonFactory JsonFactory=新的JsonFactory();
@抑制警告(“弃用”)
JsonParser JsonParser=jsonFactory.createJsonParser(内容);//省略弃用
jsonParser.nextToken();
while(jsonParser.nextToken()!=JsonToken.END_数组){
最终人员c=新人员();
while(jsonParser.nextToken()!=JsonToken.END\u对象){
if(jsonParser.getCurrentName().equals(“id”)){
c、 setId(jsonParser.getValueAsString());
}else if(jsonParser.getCurrentName().equals(“firstname”)){
c、 setFirstName(jsonParser.getValueAsString());
}else if(jsonParser.getCurrentName().equals(“lastname”)){
c、 setLastName(jsonParser.getValueAsString());
}else if(jsonParser.getCurrentName().equals(“ContactNumber”)){
列表s=新的ArrayList();
while(jsonParser.nextToken()!=JsonToken.END_数组){
最终字符串标记=jsonParser.getValueAsString();
if(令牌!=null){
s、 添加(令牌);
}
}
c、 设置联系人号码;
}
}
如果(c!=null){
添加(c);
}
}
for(个人:个人列表){
系统输出打印项次(人);
}
}
}

另请注意

,因为最外层的条件没有执行,所以问题可能出现在之前的代码中。请添加此代码。由于您是一位经验丰富的用户,我假设您检查了相关对象是否为null或其他…(但请注意)我在IDE中将parser.nextToken()设置为“watch”。由于这个原因,最外层的条件并没有被执行。这已经被删除。现在我正在努力正确解析它:s。。。还在挣扎