2016-08-24 103 views
1

我得到一个JsonString:如何将json字符串转换为bean列表?

{ 
    "student[0].firstName":"asdf", 
    "student[0].lastName":"sfd", 
    "student[0].gender":"1", 
    "student[0].foods":[ 
     "Steak", 
     "Pizza" 
    ], 
    "student[0].quote":"Enter your favorite quote!", 
    "student[0].education":"Jr.High", 
    "student[0].tOfD":"Day", 
    "student[1].firstName":"sf", 
    "student[1].lastName":"sdf", 
    "student[1].gender":"1", 
    "student[1].foods":[ 
     "Pizza", 
     "Chicken" 
    ], 
    "student[1].quote":"Enter your favorite quote!", 
    "student[1].education":"Jr.High", 
    "student[1].tOfD":"Night" 
} 

学生豆:

public class Student { 
    private String firstName; 
    private String lastName; 
    private Integer gender; 
    private List<String> foods; 
    private String quote; 
    private String education; 
    private String tOfD; 
    getXxx()...; 
    setXxx()...; 
} 

我想用杰克逊的JsonString转换到列表

其实,我要发布两个表单一种形式的内容,使用ajax。 而在SpringMVC处理程序方法中,我想获得像List或Student []类型的参数,然后直接使用。我希望春天可以解决它,或使用其他util jar做到这一点。

<form action="" method="post"> 
First Name:<input type="text" name="student[0].firstName" maxlength="12" size="12"/> <br/> 
Last Name:<input type="text" name="student[0].lastName" maxlength="36" size="12"/> <br/> 
Gender:<br/> 
Male:<input type="radio" name="student[0].gender" value="1"/><br/> 
Female:<input type="radio" name="student[0].gender" value="0"/><br/> 
Favorite Food:<br/> 
Steak:<input type="checkbox" name="student[0].foods" value="Steak"/><br/> 
Pizza:<input type="checkbox" name="student[0].foods" value="Pizza"/><br/> 
Chicken:<input type="checkbox" name="student[0].foods" value="Chicken"/><br/> 
<textarea wrap="physical" cols="20" name="student[0].quote" rows="5">Enter your favorite quote!</textarea><br/> 
Select a Level of Education:<br/> 
<select name="student[0].education"> 
    <option value="Jr.High">Jr.High</option> 
    <option value="HighSchool">HighSchool</option> 
    <option value="College">College</option> 
</select><br/> 
Select your favorite time of day:<br/> 
<select size="3" name="student[0].tOfD"> 
    <option value="Morning">Morning</option> 
    <option value="Day">Day</option> 
    <option value="Night">Night</option> 
</select> 

First Name:<input type="text" name="student[1].firstName" maxlength="12" size="12"/> <br/> 
Last Name:<input type="text" name="student[1].lastName" maxlength="36" size="12"/> <br/> 
Gender:<br/> 
Male:<input type="radio" name="student[1].gender" value="1"/><br/> 
Female:<input type="radio" name="student[1].gender" value="0"/><br/> 
Favorite Food:<br/> 
Steak:<input type="checkbox" name="student[1].foods" value="Steak"/><br/> 
Pizza:<input type="checkbox" name="student[1].foods" value="Pizza"/><br/> 
Chicken:<input type="checkbox" name="student[1].foods" value="Chicken"/><br/> 
<textarea wrap="physical" cols="20" name="student[1].quote" rows="5">Enter your favorite quote!</textarea><br/> 
Select a Level of Education:<br/> 
<select name="student[1].education"> 
    <option value="Jr.High">Jr.High</option> 
    <option value="HighSchool">HighSchool</option> 
    <option value="College">College</option> 
</select><br/> 
Select your favorite time of day:<br/> 
<select size="3" name="student[1].tOfD"> 
    <option value="Morning">Morning</option> 
    <option value="Day">Day</option> 
    <option value="Night">Night</option> 
</select> 

<p><input type="submit"/></p> 

+1

这是多么可怕的JSON。您可能需要将JSON反序列化为普通的HashMap(或JObject或其他,使用您选择的任何库),然后适当地操作到DTO中。 – user2864740

+0

可能重复http://stackoverflow.com/questions/9829403/deserialize-json-to-arraylistpojo-using-jackson –

+4

你能改变你收到的JSON吗?您的JsonString现在代表一个大项目,即{student1,student2},当它应该是n个项目{{{student1},{student2}}}的数组时。 –

回答

0

你JSON,如果它是代表学生的集合应类似于以下。所不同的是,这是表示为JSON阵列学生的集合(相对于单片student1,STUDENT2对象等)

[ 
    { 
     "firstName": "asdf", 
     "lastName": "sfd", 
     "gender": "1", 
     "foods": [ 
      "Steak", 
      "Pizza" 
     ], 
     "quote": "Enter your favorite quote!", 
     "education": "Jr.High", 
     "tOfD": "Day" 
    }, 
    { 
     "firstName": "sf", 
     "lastName": "sdf", 
     "gender": "1", 
     "foods": [ 
      "Pizza", 
      "Chicken" 
     ], 
     "quote": "Enter your favorite quote!", 
     "education": "Jr.High", 
     "tOfD": "Night" 
    } 
] 

如果是这种结构,转换到bean是使用一个衬垫谷歌的GSON库

Gson gson = new Gson(); 
Student[] student = gson.fromJson(<your string here>, Student[].class); 

现在是棘手的部分,我有其使用某种字符串函数比使用JSON库,并且可以掏出JSON作为你提供的上游系统。你将不得不使用大量的字符串操作,并且希望上面的格式不会在toString()表示中给谁提供来自源的数据(有关Java的Joshua Bloch在Effective Java中有一个很好的最佳实践一)。

无论如何,我发布了一段可用的代码(但不应该用于任何形式的生产质量代码)。这可以卷起来可能是一个单一的正则表达式,为了可读性,它没有完成。仅用于理解,因为更大的集合可能会快速窒息。您还可以探索像JACKSON这样的Streaming JSON解析器,并且可以每次只考虑一个元素,我已经将其作为练习目的而放弃了。希望这可以帮助

Gson gson = new Gson(); 
String jsonInString = "{\"student[0].firstName\": \"asdf\",\"student[0].lastName\": \"sfd\",\"student[0].gender\": \"1\",\"student[0].foods\":[\"Steak\",\"Pizza\"],\"student[0].quote\": \"Enter your favorite quote!\",\"student[0].education\": \"Jr.High\",\"student[0].tOfD\": \"Day\",\"student[1].firstName\": \"sf\",\"student[1].lastName\": \"sdf\",\"student[1].gender\": \"1\",\"student[1].foods\": [\"Pizza\",\"Chicken\"],\"student[1].quote\": \"Enter your favorite quote!\",\"student[1].education\": \"Jr.High\",\"student[1].tOfD\": \"Night\"}"; 
String jsonWithoutArrayIndices = jsonInString.replaceAll("\\[\\d\\]", "").replaceAll("student.",""); 
String jsonAsCollection = "[" + jsonWithoutArrayIndices + "]"; 
String jsonAsValidCollection = jsonAsCollection.replaceAll(",\"student.firstName\"","},{\"student.firstName\""); 
System.out.println(jsonAsValidCollection); 
Student[] students = gson.fromJson(jsonAsValidCollection, Student[].class); 
System.out.println("-----------------------------------------------"); 
System.out.println(students[0]); 
System.out.println("-----------------------------------------------"); 
+0

为什么这是downvoted? –

+0

我添加内容,你可以有一个连击建议吗? – solverpeng