Java 集合出现奇怪的JSON映射问题-缺少元素
下面是一个简单的Java代码来测试我的问题:Java 集合出现奇怪的JSON映射问题-缺少元素,java,json,jackson,pojo,objectmapper,Java,Json,Jackson,Pojo,Objectmapper,下面是一个简单的Java代码来测试我的问题: ObjectMapper mapper = new ObjectMapper(); String s = "[\n" + " {\n" + " \"id\": \"\",\n" + " \"name\": \"fsgh\",\n" + " \"email\": \"dfgh@qwe.qwe\",\n" +
ObjectMapper mapper = new ObjectMapper();
String s = "[\n" +
" {\n" +
" \"id\": \"\",\n" +
" \"name\": \"fsgh\",\n" +
" \"email\": \"dfgh@qwe.qwe\",\n" +
" \"password\": \"fdg\"\n" +
" },\n" +
" {\n" +
" \"id\": \"\",\n" +
" \"name\": \"sdfg\",\n" +
" \"email\": \"zxc@zxc.sd\",\n" +
" \"password\": \"dfghfgh\"\n" +
" }\n" +
" ]";
String jsonBody = "{\n" +
" \"id\": \"\",\n" +
" \"name\": \"<cxzzx\",\n" +
" \"email\": \"asd@asd.com\",\n" +
" \"address\": \"asd 72b\",\n" +
" \"zip\": \"1234\",\n" +
" \"city\": \"Asdf\",\n" +
" \"country\": \"Norway\",\n" +
" \"enabled\": \"true\",\n" +
" \"quota\": \"50\",\n" +
" \"expires\": \"2021-04-02\",\n" +
" \"adminAccounts\": " +
s +
"}";
Set<Account> accounts = mapper.readValue(s, Set.class);
Organization organization = mapper.readValue(jsonBody, Organization.class);
ObjectMapper mapper=new ObjectMapper();
字符串s=“[\n”+
“{\n”+
“\”id\”:\“\”,\n”+
“\'name\:\'fsgh\”,\n”+
“\“电子邮件\”:\”dfgh@qwe.qwe\“,\n”+
“\”密码\“:\”fdg\“\n”+
},\n+
“{\n”+
“\”id\”:\“\”,\n”+
“\'name\:\'sdfg\”,\n”+
“\“电子邮件\”:\”zxc@zxc.sd\“,\n”+
“\”密码\“:\”dfghfgh\“\n”+
“}\n”+
" ]";
字符串jsonBody=“{\n”+
“\”id\”:\“\”,\n”+
“\“name\”:\“我强烈建议您不要使用字符串连接,因为jackson提供了使用POJO实现这一点的可行性。它干净且不易出错
首先声明帐户的pojo
public class Account {
private String id;
private String name;
private String email;
private String password;
public Account(String id, String name, String email, String password) {
this.id = id;
this.name = name;
this.email = email;
this.password = password;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
然后是组织。注意,我们在这里包括管理员帐户列表
public class Organization {
private String id;
private String email;
private String name;
private String address;
private String zip;
private String city;
private String country;
private boolean enabled;
private int quota;
private String expires;
private List<Account> adminAccounts;
public Organization(String id, String email, String name, String address, String zip, String city, String country, boolean enabled, int quota, String expires, List<Account> adminAccounts) {
this.id = id;
this.email = email;
this.name = name;
this.address = address;
this.zip = zip;
this.city = city;
this.country = country;
this.enabled = enabled;
this.quota = quota;
this.expires = expires;
this.adminAccounts = adminAccounts;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getZip() {
return zip;
}
public void setZip(String zip) {
this.zip = zip;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public int getQuota() {
return quota;
}
public void setQuota(int quota) {
this.quota = quota;
}
public String getExpires() {
return expires;
}
public void setExpires(String expires) {
this.expires = expires;
}
public List<Account> getAdminAccounts() {
return adminAccounts;
}
public void setAdminAccounts(List<Account> adminAccounts) {
this.adminAccounts = adminAccounts;
}
}
并将它们添加到列表中
List<Account> accounts = new ArrayList<Account>();
accounts.add(account1);
accounts.add(account2);
基本上,您的字符串s由accounts表示,jsonBody由organization表示。请首先尝试创建这两个account POJO和organization,并将它们作为java对象进行操作以下是我测试的代码,以使其正常工作。我使用的是jackson-databind-2.8.6
。我怀疑在使用POJO类或您正在使用的Jackson版本中可能存在错误:
public class JacksonTest {
public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
final ObjectMapper mapper = new ObjectMapper();
final String s = "[\n" +
" {\n" +
" \"id\": \"\",\n" +
" \"name\": \"fsgh\",\n" +
" \"email\": \"dfgh@qwe.qwe\",\n" +
" \"password\": \"fdg\"\n" +
" },\n" +
" {\n" +
" \"id\": \"\",\n" +
" \"name\": \"sdfg\",\n" +
" \"email\": \"zxc@zxc.sd\",\n" +
" \"password\": \"dfghfgh\"\n" +
" }\n" +
" ]";
final String jsonBody = "{\n" +
" \"id\": \"\",\n" +
" \"name\": \"<cxzzx\",\n" +
" \"email\": \"asd@asd.com\",\n" +
" \"address\": \"asd 72b\",\n" +
" \"zip\": \"1234\",\n" +
" \"city\": \"Asdf\",\n" +
" \"country\": \"Norway\",\n" +
" \"enabled\": \"true\",\n" +
" \"quota\": \"50\",\n" +
" \"expires\": \"2021-04-02\",\n" +
" \"adminAccounts\": " + s +
"}";
final Set<Account> accounts = mapper.readValue(s, mapper.getTypeFactory().constructCollectionType(Set.class, Account.class));
System.out.println("Accounts Size: " + accounts.size());
System.out.println("Accounts: " + accounts);
System.out.println();
final Organization organization = mapper.readValue(jsonBody, Organization.class);
System.out.println("Organization Admin Accounts Size: " + organization.adminAccounts.size());
System.out.println("Organization Admin Accounts: " + organization.adminAccounts);
}
private static class Account {
@Override
public String toString() {
return "Account [id=" + this.id + ", name=" + this.name + ", email=" + this.email + ", password=" + this.password + "]";
}
public String id, name, email, password;
}
private static class Organization {
@Override
public String toString() {
return "Organization [id=" + this.id + ", name=" + this.name + ", email=" + this.email + ", address=" + this.address + ", zip=" +
this.zip + ", city=" +
this.city + ", country=" + this.country + ", enabled=" + this.enabled + ", quota=" + this.quota + ", expires=" + this.expires +
", adminAccounts=" +
this.adminAccounts + "]";
}
public String id, name, email, address, zip, city, country, enabled, quota, expires;
public Set<Account> adminAccounts;
}
}
公共类JacksonTest{
公共静态void main(字符串[]args)抛出JsonParseException、JsonMappingException、IOException{
最终ObjectMapper映射器=新ObjectMapper();
最终字符串s=“[\n”+
“{\n”+
“\”id\”:\“\”,\n”+
“\'name\:\'fsgh\”,\n”+
“\“电子邮件\”:\”dfgh@qwe.qwe\“,\n”+
“\”密码\“:\”fdg\“\n”+
},\n+
“{\n”+
“\”id\”:\“\”,\n”+
“\'name\:\'sdfg\”,\n”+
“\“电子邮件\”:\”zxc@zxc.sd\“,\n”+
“\”密码\“:\”dfghfgh\“\n”+
“}\n”+
" ]";
最后一个字符串jsonBody=“{\n”+
“\”id\”:\“\”,\n”+
“\”name\”:\”我明白了,对于s,这个数组只有一个元素,s=“[object1]”,object1有两个元素,所以accounts.size()=2,organization.admincounts=s=“[object1]”,organization.admincounts.size()=1,organization.admincounts只是有object1。你想要organization.admincounts.size()=2,organization.admincounts=“[object2],[object3]],所以s=“[object2],[object3]]”。
您可以尝试以下方法:
String s = "[\n" +
" [{\n" +
" \"id\": \"\",\n" +
" \"name\": \"fsgh\",\n" +
" \"email\": \"dfgh@qwe.qwe\",\n" +
" \"password\": \"fdg\"\n" +
" }],\n" +
" [{\n" +
" \"id\": \"\",\n" +
" \"name\": \"sdfg\",\n" +
" \"email\": \"zxc@zxc.sd\",\n" +
" \"password\": \"dfghfgh\"\n" +
" }]\n" +
" ]";
AdminAccount(或任何被调用的类)的equals/hashCode是如何实现的?我注意到两个帐户都有一个空id。如果一个帐户的equality是基于id的,那么HashSet将(正确地)忽略其中一个作为重复项。@yshavit它没有在account类中实现,我相信这对“accounts”也是有效的两个元素都(正确)的集合A,很好。adminAccount中的一个元素是什么样子的?它是否提供了任何关于发生了什么的线索?@yshavit它与accounts集合中的第一个元素完全相同。如果我有2个以上的元素,我将在“accounts”中获得完整的集合但始终只有组织中的第一个对象可以添加您的POJO类,并告诉我们您使用的是什么版本的Jackson?这似乎对我有用。
public class JacksonTest {
public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
final ObjectMapper mapper = new ObjectMapper();
final String s = "[\n" +
" {\n" +
" \"id\": \"\",\n" +
" \"name\": \"fsgh\",\n" +
" \"email\": \"dfgh@qwe.qwe\",\n" +
" \"password\": \"fdg\"\n" +
" },\n" +
" {\n" +
" \"id\": \"\",\n" +
" \"name\": \"sdfg\",\n" +
" \"email\": \"zxc@zxc.sd\",\n" +
" \"password\": \"dfghfgh\"\n" +
" }\n" +
" ]";
final String jsonBody = "{\n" +
" \"id\": \"\",\n" +
" \"name\": \"<cxzzx\",\n" +
" \"email\": \"asd@asd.com\",\n" +
" \"address\": \"asd 72b\",\n" +
" \"zip\": \"1234\",\n" +
" \"city\": \"Asdf\",\n" +
" \"country\": \"Norway\",\n" +
" \"enabled\": \"true\",\n" +
" \"quota\": \"50\",\n" +
" \"expires\": \"2021-04-02\",\n" +
" \"adminAccounts\": " + s +
"}";
final Set<Account> accounts = mapper.readValue(s, mapper.getTypeFactory().constructCollectionType(Set.class, Account.class));
System.out.println("Accounts Size: " + accounts.size());
System.out.println("Accounts: " + accounts);
System.out.println();
final Organization organization = mapper.readValue(jsonBody, Organization.class);
System.out.println("Organization Admin Accounts Size: " + organization.adminAccounts.size());
System.out.println("Organization Admin Accounts: " + organization.adminAccounts);
}
private static class Account {
@Override
public String toString() {
return "Account [id=" + this.id + ", name=" + this.name + ", email=" + this.email + ", password=" + this.password + "]";
}
public String id, name, email, password;
}
private static class Organization {
@Override
public String toString() {
return "Organization [id=" + this.id + ", name=" + this.name + ", email=" + this.email + ", address=" + this.address + ", zip=" +
this.zip + ", city=" +
this.city + ", country=" + this.country + ", enabled=" + this.enabled + ", quota=" + this.quota + ", expires=" + this.expires +
", adminAccounts=" +
this.adminAccounts + "]";
}
public String id, name, email, address, zip, city, country, enabled, quota, expires;
public Set<Account> adminAccounts;
}
}
String s = "[\n" +
" [{\n" +
" \"id\": \"\",\n" +
" \"name\": \"fsgh\",\n" +
" \"email\": \"dfgh@qwe.qwe\",\n" +
" \"password\": \"fdg\"\n" +
" }],\n" +
" [{\n" +
" \"id\": \"\",\n" +
" \"name\": \"sdfg\",\n" +
" \"email\": \"zxc@zxc.sd\",\n" +
" \"password\": \"dfghfgh\"\n" +
" }]\n" +
" ]";