java将json字符串提取到类对象类型不起作用
在我的java Spring mvc项目中,我有(有效的)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
[{
"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;
}