Java 集合出现奇怪的JSON映射问题-缺少元素

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" +

下面是一个简单的Java代码来测试我的问题:

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" +
      "  ]";