歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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)  http://www.linuxidc.com/Linux/2016-02/128288.htm

如何處理JSON中的特殊字符 http://www.linuxidc.com/Linux/2015-09/123067.htm

Struts中異步傳送XML和JSON類型的數據 http://www.linuxidc.com/Linux/2013-08/88247.htm

Linux下JSON庫的編譯及代碼測試 http://www.linuxidc.com/Linux/2013-03/81607.htm

jQuery 獲取JSON數據[$.getJSON方法] http://www.linuxidc.com/Linux/2013-03/81673.htm

用jQuery以及JSON包將表單數據轉為JSON字符串 http://www.linuxidc.com/Linux/2013-01/77560.htm

在C語言中解析JSON配置文件 http://www.linuxidc.com/Linux/2014-05/101822.htm

--------------------------------------分割線 --------------------------------------

然後,我們給所有的成員變量生成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}

Copyright © Linux教程網 All Rights Reserved