Java解析Json字符串--单个实体


最基础的Json字符串:

{
    "age": 20,
    "gender": "male",
    "grades": "三班",
    "name": "苏三",
    "weight": 63.5
}

上边是一个很基础的Json字符串,当我们看到这个字符串的时候,我们就要考虑,怎么解析这个Json字符串,解析后我们把信息放到一个什么样的实体类中。

首先,因为Json最外层使用”{}”大括弧包裹,我们能判断出,我们需要的最外层是一个类,而不是数组或者列表。那么我们定义一个类来对应它,Student.java。

接下来,我们分析一下此Json字符串中的属性元素。age对应的值是一个整数20,那么,我们就在Student类中对应的定义一个private的整形成员变量;age,gender、grades、name对应的值为字符串类型,那么,我们也相应的定义三个private的字符串成员变量;weight对应的值是一个有一位小数的浮点型,那么,我们定义一个private的float型的成员变量。(定义的成员变量名字最好跟Json字符串中的元素名字相同,这样在我们通过类来转Json字符串的时候,就能很好的对应)。

--------------------------------------分割线 --------------------------------------

[译]JSON数据范式化(normalizr) 

如何处理JSON中的特殊字符

Struts中异步传送XML和JSON类型的数据

Linux下JSON库的编译及代码测试

jQuery 获取JSON数据[$.getJSON方法]

用jQuery以及JSON包将表单数据转为JSON字符串

在C语言中解析JSON配置文件

--------------------------------------分割线 --------------------------------------

然后,我们给所有的成员变量生成get/set方法。

我们生成的Student.java如下:

package com.bean;

/**
 *  学生
 */
public class Student {

    private int age;//年龄
    private String gender;//性别,male/female
    private String grades;//班级
    private String name;//姓名
    private float weight;//体重

    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public String getGrades() {
        return grades;
    }
    public void setGrades(String grades) {
        this.grades = grades;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public float getWeight() {
        return weight;
    }
    public void setWeight(float weight) {
        this.weight = weight;
    }

}
1
现在我们要将这个Json字符串内容解析出来并存放到Student实体类中:

第一种方法,直接通过JSONObject将Json字符串转成Student。

package com.test;

import net.sf.json.JSONObject;

import com.bean.Student;

public class Domain {

    public static void main(String[] args) {

        String jsonStr = "{\"age\":20,\"gender\":\"male\",\"grades\":\"三班\",\"name\":\"苏三\",\"weight\":63.5}";

        JSONObject jsonObject = JSONObject.fromObject(jsonStr);

        Student stu = (Student) JSONObject.toBean(jsonObject, Student.class);

        System.out.println(stu.getName());

    }
}

说明:

这种方法,需要类中的成员变量名跟Json字符串中元素名相同;
Student类中成员变量必须有set方法,因为JSONObject通过toBean方法将Json字符串中元素的值赋给Student类中变量时,是通过set方法来赋值的。这也给我们解释了为什么1中说的名称要相同了;
当Student类中多了一些Json字符串中没有的成员变量,或者Json字符串多了一些Student类中没有的元素时,程序并不会报错,只是这些值在解析时,不会解析到我们的Student类中而已。
如果类中成员变量的类型跟Json字符串对应的类型不统一的话,也是有可能解析不到值的,如age值为字符串”abc”,在类中用int型age成员变量是接收不到值的。
第二种方法:从JSONObject获取各个元素对应的值

package com.test;

import net.sf.json.JSONObject;

public class Domain {

    public static void main(String[] args) {

        String jsonStr = "{\"age\":20,\"gender\":\"male\",\"grades\":\"三班\",\"name\":\"苏三\",\"weight\":63.5}";

        JSONObject jsonObject = JSONObject.fromObject(jsonStr);

        int age = jsonObject.getInt("age");
        String gender = jsonObject.getString("gender");
        String grades = jsonObject.getString("grades");
        String name = jsonObject.getString("name");
        float weight = (float) jsonObject.getDouble("weight");

        System.out.println(age);
        System.out.println(gender);
        System.out.println(grades);
        System.out.println(name);
        System.out.println(weight);

    }
}

说明:

这种方式不需要我们定义的变量名跟Json字符串中的元素名相同,如我们也可以这样String studentName = jsonObject.getString(“name”);
如果我们取的元素在Json字符串中不存在的话,会报错;
如果我们取的元素类型跟接收的类型不同的话,可能会报错;
第三种方法:用迭代器迭代输出

package com.test;

import java.util.Iterator;

import net.sf.json.JSONObject;

public class Domain {

    @SuppressWarnings("rawtypes")
    public static void main(String[] args) {

        String jsonStr = "{\"age\":20,\"gender\":\"male\",\"grades\":\"三班\",\"name\":\"苏三\",\"weight\":63.5}";

        JSONObject jsonObject = JSONObject.fromObject(jsonStr);

        Iterator keys = jsonObject.keys();

        String key = null;
        Object value = null;
        while(keys.hasNext()){
            key = (String) keys.next();
            value = jsonObject.get(key);

            System.out.println("key:"+key+" value:"+value.toString());
        }

    }
}

说明:

通过这种迭代,能将所有的元素都获取到;
用迭代的方式我们无法提前定义到每种元素对应value的类型。
最后,我们来看一下,怎么反向通过Student类来生成一个Json字符串

package com.test;

import net.sf.json.JSONObject;

import com.bean.Student;

public class Domain {

    public static void main(String[] args) {

        Student stu = new Student();

        stu.setAge(25);
        stu.setGender("female");
        stu.setGrades("一班");
        stu.setName("露西");
        stu.setWeight(51.3f);

        String jsonStr = JSONObject.fromObject(stu).toString();
        System.out.println(jsonStr);

    }
}

生成的字符串为:

{"age":25,"gender":"female","grades":"一班","name":"露西","weight":51.3}

相关内容