杰克逊反序列化问题

时间:2011-05-27 20:11:05

标签: java json jackson deserialization

我从REST调用收到以下JSON:

"socialConnectionsData" : {
  "friends" : [ {
    "friend" : {
      "firstname" : "John",
      "lastname" : "Doe"
     }
    }]
}

我目前的课程如下:

public class SocialConnectionsData {
private List<Friend> friends;

public List<Friend> getFriends() {
    return friends;
}

public void setFriends(List<Friend> friends) {
    this.friends = friends;
}    
}

然而,我得到杰克逊的一个例外,说明“朋友”是一个未被承认的领域。我如何拥有一群朋友并保持朋友的类型?

3 个答案:

答案 0 :(得分:1)

因为该物业是“朋友”而不是“朋友”?

答案 1 :(得分:1)

在我看来,你在那里有一个额外的属性名称。杰克逊期待这样的JSON与你的对象相对应:

"socialConnectionsData" : {
  "friends" : [ {
      "firstname" : "John",
      "lastname" : "Doe"
    }]
}

您不需要做任何事情来维护朋友的类型,因为您的列表是作为通用参数声明的。

如果你想反过来让你的对象与JSON匹配,那么你需要额外的间接级别,如下所示:

public class SocialConnectionsData {
    private List<FriendWrapper> friends;

    public List<FriendWrapper> getFriends() {
        return friends;
    }

    public void setFriends(List<FriendWrapper> friends) {
        this.friends = friends;
    }    
}

public class FriendWrapper {
    private Friend friend;

    public Friend getFriend() {
        return friend;
    }

    public void setFriend(Friend friend) {
        this.friend = friend;
    }
}

答案 2 :(得分:1)

您的JSON必须与您的对象结构匹配,此处错误消息确实指出了问题:您的主级对象(SocialConnectionsData)没有属性“socialConnectionsData”。班级名称无关紧要。

因此,您应该删除最外层的“socialConnectionsData”或使用包装器对象,如:

class Wrapper {
  public SocialConnectionsData socialConnectionsData; // and/or setter to set it
}

并绑定到它。这将使JSON和对象结构匹配。