1. 程式人生 > >java中解析一個json串,本文詳細介紹了安卓原生的解析以及用fastjson解析

java中解析一個json串,本文詳細介紹了安卓原生的解析以及用fastjson解析

在java或安卓中解析JSON有很多種方式,可以用谷歌給安卓提供的原生的解析方式解析安卓,也可以選擇第三方類庫,一些比較流行的解析方式如fastjson,Gson等,本文就簡單介紹一下java工程中fastjson解析json資料。在介紹fastjson解析之前,我想先給大家用谷歌給安卓提供的原生解析方式解析一個JSON資料串。

(一)google原生的解析方式:

用原生的解析方式需要用到一些google提供的類庫,在你的工程下新建一個org.json包,然後可以從https://github.com/stleary/JSON-java下載其提供的java解析JSON的類庫

然後把這些下載好的類複製到org.json包下,如下圖:

給出json串如下:

{"firstName":"John","lastName":"Smith","address":{"streetAddress":"奧運村西",
"city":"北京","postalCode":"100019","state":"北京"},
"phoneNumber":[{"number":" 10086","type":"home"},{"number":" 10010","type":"fax"}],"sex":"male","age":25}
{...}裡面的是一個JSONObject,而[...]是一個JSONArray

由JSON字串我們可以定義出實體類如下:

public class 
User { private String firstName; private String lastName; private String sex; private int age; private Address address; private List<Phone> phoneNumber; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this
.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public List<Phone> getPhoneNumber() { return phoneNumber; } public void setPhoneNumber(List<Phone> phoneNumber) { this.phoneNumber = phoneNumber; } }
public class Address {
    private String streetAddress;
    private String city;
    private String state;
    private String postalCode;
    public String getStreetAddress() {
        return streetAddress;
}

    public void setStreetAddress(String streetAddress) {
        this.streetAddress = streetAddress;
}

    public String getCity() {
        return city;
}

    public void setCity(String city) {
        this.city = city;
}

    public String getState() {
        return state;
}

    public void setState(String state) {
        this.state = state;
}

    public String getPostalCode() {
        return postalCode;
}

    public void setPostalCode(String postalCode) {
        this.postalCode = postalCode;
}
}
public class Phone {
    private String type;
    private String number;
    public String getType() {
        return type;
}

    public void setType(String type) {
        this.type = type;
}

    public String getNumber() {
        return number;
}

    public void setNumber(String number) {
        this.number = number;
}
}
將json字串解析到實體類裡面
public class TestJson02 {
    public static void main(String[] args) {
        String str = "{\"firstName\":\"John\",\"lastName\":\"Smith\",\"address\":{\"streetAddress\":\"奧運村西\",\"city\":\"北京\",\"postalCode\":\"100019\",\"state\":\"北京\"},\"phoneNumber\":[{\"number\":\" 10086\",\"type\":\"home\"},{\"number\":\" 10010\",\"type\":\"fax\"}],\"sex\":\"male\",\"age\":25}\n";
User user = parserUser(str);
System.out.println(toJSONString(user));
}
    private static String toJSONString(User user) {
        JSONObject userObj = new JSONObject();
userObj.put("firstName", user.getFirstName());
userObj.put("lastName", user.getLastName());
userObj.put("sex", user.getSex());
userObj.put("age", user.getAge());
JSONObject addressObj = new JSONObject();
Address address = user.getAddress();
addressObj.put("streetAddress", address.getStreetAddress());
addressObj.put("city", address.getCity());
addressObj.put("state", address.getState());
addressObj.put("postalCode", address.getPostalCode());
userObj.put("address", addressObj);
JSONArray phoneNumber = new JSONArray();
List<Phone> phones = user.getPhoneNumber();
        for (Phone phone : phones) {
            JSONObject number = new JSONObject();
number.put("type", phone.getType());
number.put("number", phone.getNumber());
phoneNumber.put(number);
}
        userObj.put("phoneNumber", phoneNumber);
        return userObj.toString();
}
    private static User parserUser(String str) {
        JSONObject object = new JSONObject(str);
User user = new User();
user.setFirstName(object.optString("firstName"));
user.setLastName(object.optString("lastName"));
user.setSex(object.optString("sex"));
user.setAge(object.optInt("age"));
JSONObject addressObj = object.optJSONObject("address");
Address address = new Address();
address.setStreetAddress(addressObj.optString("streetAddress"));
address.setCity(addressObj.optString("city"));
address.setState(addressObj.optString("state"));
address.setPostalCode(addressObj.optString("postalCode"));
user.setAddress(address);
List<Phone> phones = new ArrayList<>();
JSONArray phoneNumber = object.optJSONArray("phoneNumber");
        for (int i = 0; i < phoneNumber.length(); i++) {
            JSONObject numberObj = phoneNumber.optJSONObject(i);
Phone phone = new Phone();
phone.setType(numberObj.optString("type"));
phone.setNumber(numberObj.optString("number"));
phones.add(phone);
}
        user.setPhoneNumber(phones);
        return user;
}
}
(二)用fastjson去解析一個json字串

用fastjson解析json字串需要先匯入jar包,在這裡我推薦用maven去匯入包,這樣有一個好處,就是可以匯入其依賴的相關jar包。

實體類如下圖:

public class User {
    @JSONField(name = "firstName")//注意,屬性加入此註解,則在java檔案混淆後依然可以得到這個屬性
private String firstName;
    private String lastName;
    private String sex;
    private int age;
@JSONField(serialize = false)//此註解可以使序列化後的json字串中沒有這個屬性
private Address address;
    private List<Phone> phoneNumber;
@JSONField(name = "10000")
    private String text;
    private int x;
    private int y;
    public String getFirstName() {
        return firstName;
}

    public void setFirstName(String firstName) {
        this.firstName = firstName;
}

    public String getLastName() {
        return lastName;
}

    public void setLastName(String lastName) {
        this.lastName = lastName;
}

    public String getSex() {
        return sex;
}

    public void setSex(String sex) {
        this.sex = sex;
}

    public int getAge() {
        return age;
}

    public void setAge(int age) {
        this.age = age;
}

    public Address getAddress() {
        return address;
}

    public void setAddress(Address address) {
        this.address = address;
}

    public List<Phone> getPhoneNumber() {
        return phoneNumber;
}

    public void setPhoneNumber(List<Phone> phoneNumber) {
        this.phoneNumber = phoneNumber;
}

    public String getText() {
        return text;
}

    public void setText(String text) {
        this.text = text;
}
    @JSONField(name = "location")
    public void setLocation(List<Integer> location) {
        x = location.get(0);
y = location.get(1);
}

    public int getX() {
        return x;
}

    public int getY() {
        return y;
}
}
public class Address {
    private String streetAddress;
    private String city;
    private String state;
    private String postalCode;
    public String getStreetAddress() {
        return streetAddress;
}

    public void setStreetAddress(String streetAddress) {
        this.streetAddress = streetAddress;
}

    public String getCity() {
        return city;
}

    public void setCity(String city) {
        this.city = city;
}

    public String getState() {
        return state;
}

    public void setState(String state) {
        this.state = state;
}

    public String getPostalCode() {
        return postalCode;
}

    public void setPostalCode(String postalCode) {
        this.postalCode = postalCode;
}
}
public class Phone {
    private String type;
    private String number;
    public String getType() {
        return type;
}

    public void setType(String type) {
        this.type = type;
}

    public String getNumber() {
        return number;
}

    public void setNumber(String number) {
        this.number = number;
}
}
解析方式如下程式碼:
public class Test {
    public static void main(String[] args) {
        String src = "{\n" +
                "     \"firstName\": \"John\",\n" +
                "     \"10000\": \"一萬\",\n" +
                "     \"location\": [50, 100],\n" +
                "     \"lastName\": \"Smith\",\n" +
                "     \"sex\": \"male\",\n" +
                "     \"age\": 25,\n" +
                "     \"address\": \n" +
                "     {\n" +
                "         \"streetAddress\": \"21 2nd Street\",\n" +
                "         \"city\": \"New York\",\n" +
                "         \"state\": \"NY\",\n" +
                "         \"postalCode\": \"10021\"\n" +
                "     },\n" +
                "     \"phoneNumber\": \n" +
                "     [\n" +
                "         {\n" +
                "           \"type\": \"home\",\n" +
                "           \"number\": \"212 555-1234\"\n" +
                "         },\n" +
                "         {\n" +
                "           \"type\": \"fax\",\n" +
                "           \"number\": \"646 555-4567\"\n" +
                "         }\n" +
                "     ]\n" +
                " }";
//        Map parse = (Map) JSON.parse(src);
//        System.out.println(((Map) parse.get("address")).get("streetAddress"));
//        System.out.println(((Map) ((List) parse.get("phoneNumber")).get(0)).get("type"));
User user = JSON.parseObject(src, User.class);
System.out.println(user.getFirstName());
//        System.out.println(user.getText());
//        System.out.println(user.getX());
//        System.out.println(user.getY());
System.out.println(JSON.toJSONString(user));
//        List<Integer> list = JSON.parseArray("[100, 40, 12, 452]", Integer.class);
//        System.out.println(user.getAddress().getCity());
//        System.out.println(user.getPhoneNumber().get(0).getNumber());
}
}

相關推薦

java解析一個json本文詳細介紹原生解析以及fastjson解析

在java或安卓中解析JSON有很多種方式,可以用谷歌給安卓提供的原生的解析方式解析安卓,也可以選擇第三方類庫,一些比較流行的解析方式如fastjson,Gson等,本文就簡單介紹一下java工程中fastjson解析json資料。在介紹fastjson解析之前,我想先給大

Java輸入一個十進位制數如何轉換為二進位制數

方法一:利用Java API直接轉換 十進位制數如何轉換為二進位制數,這在Java API 中有一個方法,Integer.toBinaryString( ) 括號裡面寫上你要轉換的十進位制數,這樣可以直接轉換。例如: public static void

vc程式設計遇到一個編譯問題原來是少LIB檔案 (ZT)

摘自網路,感覺挺實用的,基於VC,例如VC6.0等等 (1) vc網路程式設計中遇到一個編譯問題,原來是少了WSOCK32.LIB。在 project-->settings-->Link-->Object/Library modules 中加入庫WSO

java高併發系列 - 第22天:java底層工具類Unsafe高手必須要

這是java高併發系列第22篇文章,文章基於jdk1.8環境。 本文主要內容 基本介紹 通過反射獲取Unsafe例項 Unsafe中的CAS操作 Unsafe中原子操作相關方法介紹 Unsafe中執行緒排程相關方法 park和unpark示例 Unsafe鎖示例 Unsafe中保證變數的可見性 Unsafe

java輸出一個字符裏面的空格字母還有數字的數目舉例說明

clas 視頻下載 stat int 結果 art except nta tof 9.3 輸出一個字符串裏面的空格,字母還有數字的數目。 (視頻下載) (全部書籍) public class Test { public static void main

RapidJson(V1.1.0)的Value簡單操作(拼接json存取檔案json解析json)

#include <rapidjson/document.h> #include <rapidjson/stringbuffer.h> #include <rapidjson/pointer.h> #include <rapidjson/writer.h

Java——在一個字串查詢一個子計算出來這個子在字串出現的次數。

引入包:import java.util.Scanner;main函式:public static void main(String[] args){Scanner s = new Scanner(Sy

Java使用org.jsonjson-lib解析JSON

contents load user cti clas and arraylist 源碼 fur 文章目錄 [隱藏] 一。JavaProject中org.json解析JSON 1.JSON的org.son-api下載 1)JSON網址2

輸入一個子一個求該子在整個字串出現的次數

編寫應用程式,輸入一個子串和一個整串,求該子串在整個字串中出現的次數 import java.util.*; public class Tetso5 { public static void main(String[] args) { // TODO Auto-generated

Java傳入一個時間段取出該時間段內所有日期的集合

package com.yhsb.assisData.controller; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.u

javaIterable介面的使用實現一個單鏈表的迭代器

單鏈表實現: public class MyLinkedList <T>{ private static class Entry<E>{ private E value; private Entry next;

解析json並按照某個欄位排序

本文將為大家介紹json解析並按照某個欄位排序的方法。如果是漢字,轉化為漢語拼音後,按照字典順序排序。   原始json [{"proportionCost":0,"busiName":"aaav","userList":"李雷","allCost":53800,"liuCos

javalist裡面存放map根據map的某一個欄位進行排序

Java中list裡面存放map,根據map中的某一個欄位進行排序 例如: package com;   import java.util.ArrayList;   import java.util.Collections;   import java.util.Comparator;   impor

從kafka獲取資料解析json格式寫入到mysql

專案需求:將kafka解析來的日誌獲取到資料庫的變更記錄,按照訂單的級別和訂單明細級別寫入資料庫,一條訂單的所有資訊包括各種維度資訊均儲存在一條json中,寫入mysql5.7中。 配置資訊: [Global] kafka_server=xxxxxxxxxxx:9092 kafka_to

leetcode-java.T005_LongestPalindromicSubstringTotal 給定一個字串S找出它的最大的迴文子

敬請關注部落格,後期不斷更新優質博文,謝謝 每天j堅持刷leetcode----找出最大的迴文字串 package leetcode.T005_LongestPalindromicSubstringTotal; /** * @author 周志祥 E-mai

Java輸入一個整數反向輸出這個整數

java反向輸入整數的位數可以採用取餘判斷的方式,示例如下: import java.util.Scanner; public class Dd { public static void

【soapUI】解決post請求時body為json伺服器無法解析問題

       背景:傳送post請求,且body為json串時,response響應值總是提示“XX欄位值不能為空”,採用Postman、jmeter工具嘗試,結果都是如此,但Postman、jme

java判斷一個字串是否包含另外一個字串如果包含計算出字串的開始位置

對於一個給定的source字串和一個target字串,你應該在source字串中找出target出現的第一個位置(從0開始) 程式碼如下: int h = 0;

【小家javaJava二進位制與位運算(“^,&,>>,>>>”)使用移位演算法寫一個流水號生成器(訂單號生成器)

相關閱讀 每篇一句 高樓大廈,都是平地起的。 整個java體系,其實就是一本祕籍,那就是:java基礎! (基礎如果打的紮實,在實際開發工作中會帶來極大的助益) 二進位制 二進位制是計算技術中廣泛採用的一種數制。二進位制資料是用0和1兩個數碼來表示的