如何将json字符串转换为bean列表?

解决问题

我得到一个JsonString:

{
   "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转换为List。

实际上,我想在一种表单中发布两种表单内容,请使用ajax。在SpringMVC处理程序方法中,我想获取类似List或Student []类型的参数,然后直接使用。我希望spring可以解决它,或使用其他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>

拉马尚德兰

您的JSON(如果它表示学生的集合)应类似于以下内容。不同之处在于这是一个表示为JSON数组的学生集合(与单体学生,学生2对象等相对)

[
    {
        "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"
    }
]

如果是这种结构,则使用Google的GSON库可以一次转换为bean

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

现在是棘手的部分,我有一个上游系统,该系统使用某种字符串函数,而不是使用JSON库,并且可以按您提供的方式封装JSON。您将不得不使用大量的字符串操作,并且希望上面的格式在任何从源中提供数据的人的toString()表示中都不会改变(Joshua Bloch在《有效的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("-----------------------------------------------");

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章