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

标签 java json spring spring-mvc

我得到一个 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"
}

学生 bean :

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()...;
}

我想使用jackson将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 数组表示的学生集合(而不是单一的 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"
    }
]

如果是这种结构,则使用 Google 的 GSON 库即可轻松转换为 Bean

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

现在是棘手的部分,我有一个上游系统,它使用某种字符串函数而不是使用 JSON 库,并且可以按照您提供的方式输出 JSON。您将不得不使用大量的字符串操作,并且还希望上面的格式不会改变从源中向您提供数据的 toString() 表示形式(Joshua Bloch 在《Effective Java》中对此有一个出色的最佳实践)。

尽管如此,我还是发布了一段有效的代码(但绝不应该以任何形式的生产质量代码使用)。这可以作为单个正则表达式进行汇总,为了可读性,它没有完成。仅将此用于理解,因为较大的集合很快就会使事情变得困惑。您还可以探索像 JACKSON 这样的流式 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("-----------------------------------------------");

关于java - 如何将 json 字符串转换为 bean 列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39113938/

相关文章:

java - 泛型扩展行类型

java - 多项式的 toString 方法

C# 在不反序列化的情况下在 JSON 中搜索

java - 如何管理 Spring Batch block 内较短的事务?

java - MongoDB 中的 BasicDBObject 拒绝接受整数值

java - Weblogic Workshop 10.3 中的问题,Weblogic Portlet 开发

json - Apache Spark 读取带有额外列的 JSON

javascript - 在 Jqgrid 中显示数据

java - 如何找到列表包含另一个列表中的所有元素?

java - Apache Spring - 具有多行属性值的 Bean