为什么“使用Jackson时无法反序列化``START_OBJECT令牌之外”的实例

时间:2017-12-11 02:51:34

标签: java json jackson

感谢有关属性名称不匹配的问题。但是,我已经使它们保持一致但错误相同。

我正在使用Jackson将JSON数组转换为Java对象数组。

代码如下所示,这是代码条目:

import java.io.File;
import com.fasterxml.jackson.databind.ObjectMapper;
import jackson.vo.User;

public class JsonConvertTest {
    public static void main(String args[]){
        try{
            ObjectMapper objectMapper = new ObjectMapper();
            File file = new File("results.json");
            User[] users= objectMapper.readValue(file, User[].class);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

这是值对象

package jackson.vo;

import com.fasterxml.jackson.annotation.JsonProperty;

public class User {
    @JsonProperty("firstName")
    String firstName;
    @JsonProperty("lastName")
    String lastName;

    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;
    }
}

这是JSON数组:

{
    "users":[
        { "firstName":"Tom", "lastName":"Jackson"},         
        { "firstName":"Jenny", "lastName":"Mary"},  
        { "firstName":"Red", "lastName":"Blue"},        
        { "firstName":"Jason", "lastName":"John"},  
        { "firstName":"May", "lastName":"Black"}    
    ]
}

输出结果为:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `jackson.vo.User[]` out of START_OBJECT token
 at [Source: (File); line: 1, column: 1]

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

JSON文件中的根级对象是JSON 对象,但是您要告诉jackson将该文件作为用户数组读取。

尝试以下内容:

{=INDEX(B:B;SMALL(A:A=E2;ROW());ROW())}

答案 1 :(得分:0)

我很确定这是一个区分大小写的问题。杰克逊默认查找属性“getters”,因此您拥有“getFirstName”。但是,您的JSON文件是“firstname”。

再次尝试使用源json文件和类之间的区分大小写相同。

答案 2 :(得分:0)

注意lastname(您的POJO)与lastName(Json)的拼写。将您的pojo更改为firstName和lastName以匹配您的JSON或在每个字段上方设置注释,如下所示:

public class User {
    @JsonProperty("firstname");
    String firstName;
    @JsonProperty("lastname");
    String lastName;

答案 3 :(得分:0)

这是因为财产不匹配。你可以试试这个

public class User {
@JsonProperty("firstname")
    String firstName;
@JsonProperty("lastname")
    String lastName;  
}

@JsonProperty用于表示外部属性名称,数据格式使用的名称(JSON或其他支持的数据格式之一)