Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java将json字符串提取到类对象类型不起作用_Java_Spring - Fatal编程技术网

java将json字符串提取到类对象类型不起作用

java将json字符串提取到类对象类型不起作用,java,spring,Java,Spring,在我的java Spring mvc项目中,我有(有效的)json字符串,比如: [{ "name": "sonia", "emails": [{ "email": "abc@gmail.com", "type": "Work" }, { "email": "xyz@gmail.com", "type": "office" }] }] 我有电子邮件课程: public class Email

在我的java Spring mvc项目中,我有(有效的)json字符串,比如:

[{
    "name": "sonia",
    "emails": [{
        "email": "abc@gmail.com",
        "type": "Work"
    }, {
        "email": "xyz@gmail.com",
        "type": "office"
    }]    
}]
我有电子邮件课程:

public class Email 
{

  private String email;
  private String type;
//setters & getters

}
用户

public class User {

private int id;
private String name;
private Set<Email> emails;
//setters and getters

}
因此,我尝试了以下代码:

    try {

    JSONArray jsonarray = new JSONArray(JsonString);

    Gson gson = new Gson();

    User[] users = gson.fromJson(jsonarray.toString(), User[].class);

    for (int i = 0; i < users.length; i++) {

    //fetches name
    logger.info(users[i].getName());

    //here I want to fetch user with email/emails

    logger.info(users[i].getEmails());
   //but not getting results

    }

    } catch (Exception e) {
    logger.error("Contact save > Error: " + e.getMessage());
    }

我认为您试图将json映射到错误的对象。获取json并发布,然后应该更新对象。我认为你应该在它之后做如下的事情:

电子邮件类别:

public class Email { 
    private String email;
    private String type;
    }
用户类别:

public class User{

private String name;

private List<Email> emails = new ArrayList<Email>();
}
公共类用户{
私有字符串名称;
私有列表电子邮件=新建ArrayList();
}

使用ObjectMapper
。然后看看如何使用这是一个有效的解决方案,您可以相应地调整代码:

public static void main(String args[]) {
    String jsonString = "[{\n" +
            "    \"name\": \"sonia\",\n" +
            "    \"emails\": [{\n" +
            "        \"email\": \"abc@gmail.com\",\n" +
            "        \"type\": \"Work\"\n" +
            "    }, {\n" +
            "        \"email\": \"xyz@gmail.com\",\n" +
            "        \"type\": \"office\"\n" +
            "    }]    \n" +
            "}]";
    JsonObject jsonObject = new JsonObject();
    jsonObject.addProperty("name", "sonia");
    JsonArray jsonArray = new JsonArray();
    JsonObject jsonObject1 = new JsonObject();
    jsonObject1.addProperty("email", "abc@gmail.com");
    jsonObject1.addProperty("type", "Work");
    JsonObject jsonObject2 = new JsonObject();
    jsonObject2.addProperty("email", "xyz@gmail.com");
    jsonObject2.addProperty("type", "office");
    jsonArray.add(jsonObject1);
    jsonArray.add(jsonObject2);
    jsonObject.add("emails", jsonArray);
    System.out.println(jsonObject.toString());

    JsonArray jsonArray1 = new JsonArray();
    jsonArray1.add(jsonObject);
    Gson gson = new Gson();

    User[] users = gson.fromJson(jsonArray1, User[].class);

    for (int i = 0; i < users.length; i++) {
        System.out.println(users[i].getName());
        System.out.print(users[i].getEmails().toString());
    }
}
publicstaticvoidmain(字符串参数[]){
字符串jsonString=“[{\n”+
“\'name\':\'sonia\',\n”+
“\“电子邮件\”:[{\n”+
“\“电子邮件\”:\”abc@gmail.com\“,\n”+
“\”类型\“:\”工作\“\n”+
},{\n+
“\“电子邮件\”:\”xyz@gmail.com\“,\n”+
“\”类型\“:\”办公室\“\n”+
“}]\n”+
"}]";
JsonObject JsonObject=新的JsonObject();
jsonObject.addProperty(“名称”、“sonia”);
JsonArray JsonArray=新的JsonArray();
JsonObject JsonObject 1=新的JsonObject();
jsonObject1.addProperty(“电子邮件”abc@gmail.com");
jsonObject1.addProperty(“类型”、“工作”);
JsonObject JsonObject 2=新的JsonObject();
jsonObject2.addProperty(“电子邮件”xyz@gmail.com");
jsonObject2.addProperty(“类型”、“办公室”);
add(jsonObject1);
add(jsonObject2);
添加(“电子邮件”,jsonArray);
System.out.println(jsonObject.toString());
JsonArray jsonArray1=新的JsonArray();
jsonArray1.add(jsonObject);
Gson Gson=新的Gson();
User[]users=gson.fromJson(jsonArray1,User[].class);
for(int i=0;i
试试这个

我想你的意思是获取场景的元素

 for (int i = 0; i < users.length; i++) {

 Set<Email> tempEmail = users[i].getEmails();
 Object [] tempEmailObj = tempEmail .toArray();
 Email[] email = Arrays.copyOf(tempEmailObj , tempEmailObj .length, Email[].class);
 String nemail = email[0].getEmail();

 //fetch name
  logger.info(users[i].getName());


//fetch user with email
 logger.info(nemail);
 }
for(int i=0;i
并把

public Set<Email> getEmails() {
        return emails;
    }
public Set getEmails(){
回复邮件;
}

在用户类

中,您得到的错误是什么?如果没有注释,则可能是使用泛型,即GSON可能不知道集合包含类型为
电子邮件
的对象。由于类型擦除,泛型类型通常在运行时不可用-反射数据中除外,因此它可能在字段元数据中仍然可用,尽管我不确定这一点,也不知道GSON如何处理它。您是否尝试将电子邮件[]
作为测试?错误:INFO | 0 INFO | 0 INFO | 0 INFO | 0 INFO | 0 INFO | 0 INFO | 0 INFO | 0 INFO | 0
 for (int i = 0; i < users.length; i++) {

 Set<Email> tempEmail = users[i].getEmails();
 Object [] tempEmailObj = tempEmail .toArray();
 Email[] email = Arrays.copyOf(tempEmailObj , tempEmailObj .length, Email[].class);
 String nemail = email[0].getEmail();

 //fetch name
  logger.info(users[i].getName());


//fetch user with email
 logger.info(nemail);
 }
public Set<Email> getEmails() {
        return emails;
    }