2016-08-24 101 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