Json解析

前端調(diào)用API的時(shí)候大多數(shù)都是使用json作為數(shù)據(jù)的返回格式,json也可以作為一種格式來(lái)進(jìn)行數(shù)據(jù)存儲(chǔ),也給我們提供了一種序列化的方式。
??Json使用花括號(hào){}包含的鍵值對(duì)結(jié)構(gòu),key必須是string類型,value為任何基本類型或數(shù)據(jù)結(jié)構(gòu)。標(biāo)準(zhǔn)的json基本數(shù)據(jù)類型有string、number、true、false、null;
??Json有兩種數(shù)據(jù)結(jié)構(gòu):1.Map,也稱為對(duì)象:{'key1':'value1','key2':'value2'} 2.Array:['arr1','arr2','arr3']。也就是說(shuō)所有JSON對(duì)象都是要以這些形式表示,



??要注意,上面的例子中,null表示一個(gè)屬性或元素沒(méi)有值,而''表示的是空字符串。
??JSON字符串與JSON對(duì)象的區(qū)別,下面說(shuō)一下:

  • JSON對(duì)象是直接可以使用JQuery操作的格式,和js中的對(duì)象一樣,可以用對(duì)象(類名)點(diǎn)出屬性(方法)。

var str2 = { "name": "haorooms", "sex": "man" };

  • JSON字符串僅僅只是一個(gè)字符串,一個(gè)整體,不截取的話沒(méi)辦法取出其中存儲(chǔ)的數(shù)據(jù),不能直接使用,除非你只想alert()他;

解析與轉(zhuǎn)換Json的常用包——Fastjson

Fastjson是一個(gè)Java語(yǔ)言編寫的JSON處理器,由阿里巴巴公司開發(fā)。它采用一種“假定有序快速匹配”的算法,把JSON Parse的性能提升到極致,是目前Java語(yǔ)言中最快的JSON庫(kù)。下面來(lái)介紹一下Fastjson常用類。

(1)com.alibaba.fastjson.JSON

Fastjson API入口類是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON類上的靜態(tài)方法直接完成。

Object parse(String text); // 把JSON文本parse為JSONObject或者JSONArray 
JSONObject parseObject(String text); // 把JSON文本parse成JSONObject 
T parseObject(String text, Class clazz); // 把JSON文本parse為JavaBean 
JSONArray parseArray(String text); // 把JSON文本parse成JSONArray 
List parseArray(String text, Class clazz); //把JSON文本parse成JavaBean集合 
String toJSONString(Object object); // 將JavaBean序列化為JSON文本 
String toJSONString(Object object, boolean prettyFormat); // 將JavaBean序列化為帶格式的JSON文本 
Object toJSON(Object javaObject); //將JavaBean轉(zhuǎn)換為JSONObject或者JSONArray

【示例】

protected JSONObject wrapHint(Object o) {
   return o == null?null:
      (o instanceof JSONObject?(JSONObject)o:
        (o instanceof String?JSON.parseObject("{\'.\':\'" + (String)o + "\'}"):
           null));
}
(2)JSONObject類

JSONObject組織形式是一個(gè)鍵值對(duì),事實(shí)上,JSONObject是一個(gè)Map。解析成功后,如果是Java內(nèi)置對(duì)象,可以直接調(diào)用相應(yīng)的方法獲取值,比如public Integer getInteger(String key);如果不是內(nèi)置對(duì)象,可以調(diào)用public JSONObject getJSONObject(String key)來(lái)讀取對(duì)象。如果還是數(shù)組,可以調(diào)用public JSONArray getJSONArray(String key)。
??JSONObject可以解析Map、JavaBean對(duì)象等,讓我們一起來(lái)看一下JSONObject的構(gòu)造方法。

    private static final int DEFAULT_INITIAL_CAPACITY = 16;
    private final Map<String, Object> map;
    public JSONObject() {
        this(16, false);
    }

    public JSONObject(Map<String, Object> map) {
        this.map = map;
    }

    public JSONObject(boolean ordered) {
        this(16, ordered);
    }

    public JSONObject(int initialCapacity) {
        this(initialCapacity, false);
    }

    public JSONObject(int initialCapacity, boolean ordered) {
        if(ordered) {
           //根據(jù)初始化容量初始化map
            this.map = new LinkedHashMap(initialCapacity);
        } else {
            this.map = new HashMap(initialCapacity);
        }
    }

但是JSONObject沒(méi)有辦法解析類似于HashMap<String,JSONObject>和HashMap<String, HashMap<String, Object>>的Map,這是因?yàn)镴SONObject只認(rèn)沒(méi)有泛型的HashMap。

使用JSONObject構(gòu)建json

JSONObject person = new JsonObject();
try{
    person.put("namr",ada);
    person.put("age",12);
    person.put("major",new String[]{"理發(fā)","挖掘機(jī)"});
    //print
    System.out.println(person.toString());
}catch(JSONException e){
}

使用Map構(gòu)建json

Map<String,Object> person = new HashMap<String,Object>();
person.put("namr",ada);
person.put("age",12);
person.put("major",new String[]{"理發(fā)","挖掘機(jī)"});
//print
System.out.println(new JSONObject(person).toString());

使用JavaBean構(gòu)建json

Person person = new Person();
person.setName(ada);
person.setAge(12);
person.setMajor(new String[]{"理發(fā)","挖掘機(jī)"});
//print
System.out.println(new JSONObject(person));

從文件中讀取json

public static void main(String args[])throws IOException,JSONException{
     File file = new File(//json文件路徑);
     String content = FileUtils.readFileToString(file);
     JSONObject jsonObject = new JsonObject(content);
     //從文件讀取json判斷null
     if(jsonObject.isNull("name")){
            System.out.println("姓名是"+jsonObject.getString("name"));
     }
     System.out.println("年齡是"+jsonObject.getDouble("age"));
     System.out.println("有沒(méi)有女朋友"+jsonObject.getBoolean("has_girlFriend"));
     JSONArray majorArray = jsonObject.getJSONArray("major");
     for(int i=0;i<majorArray.length();i++){
          String m = (String)majorArray.get(i);
          System.out.println("專業(yè)-"+(i+1)+m);
     }
}

從JSONObject獲取keySet

String string = "{key_1:123, key_2:234, key_3:567}";
JSONObject json= JSONObject.fromObject(string);
Set<String> set = json.keySet();
for(String key : set){
     System.out.println("key=="+key);
}
(3)JSONArray

JSONArray用來(lái)存放JSON數(shù)組。解析成功后,如果是Java對(duì)象,可以調(diào)用相應(yīng)方法獲取值,比如public Integer getInteger(int index)。如果不是內(nèi)置對(duì)象,可以調(diào)用public JSONObject getJSONObject(int index)來(lái)讀取對(duì)象。

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;

public class ParseJSONObject {

    public static void main(String args[]){
        String json = "[{\"id\":1,\"type\":\"cycle\",\"attribute\":{\"center\":\"(10.4, 123.345)\", \"radius\":67.4}},{\"id\":2,\"type\":\"polygon\",\"attribute\":[{\"vertex\":\"(10.4, 133.345)\"}, {\"vertex\":\"(10.4, 143.345)\"}]}]";
        JSONArray array = JSON.parseArray(json);
        System.out.println(array.getJSONObject(0).getJSONObject("attribute").get("center"));
        System.out.println(array.getJSONObject(1).getJSONArray("attribute").getJSONObject(1).get("vertex"));
    }
}

輸出為:
(10.4, 123.345)
(10.4, 143.345)

JSONArray實(shí)際上是一個(gè)List,讓我們來(lái)看一下它的構(gòu)造方法:

   private final List<Object> list;
   public JSONArray() {
        this.list = new ArrayList(10);
    }

    public JSONArray(List<Object> list) {
        this.list = list;
    }

    public JSONArray(int initialCapacity) {
        this.list = new ArrayList(initialCapacity);
    }

所以我們可以像使用List一樣使用JSONArray:

public <T> T[] toArray(T[] a)    //把JSONArray變成數(shù)組
public boolean add(Object e)     //向JSONArray添加元素
public boolean contains(Object o)
public Iterator<Object> iterator()
public void setComponentType(Type componentType)
public Type getComponentType()   //取得一個(gè)數(shù)組的Class對(duì)象,非數(shù)組類型無(wú)法通過(guò)getComponentType()獲取到相應(yīng)的 Class 對(duì)象,如char[].class 調(diào)用此方法得到的就是char,但是char.class得到的就是nnull

Json的缺點(diǎn)

①JSON是文本,它的效率不高

  • 所有的數(shù)據(jù)都是字符形式的JSON需要轉(zhuǎn)換處理。
  • 每個(gè)值在每個(gè)文檔中都帶有其鍵名稱,需要更多的存儲(chǔ)和處理。
  • 允許表示復(fù)雜的結(jié)構(gòu),導(dǎo)致運(yùn)行時(shí)開銷。

如果將JSON作為一種數(shù)據(jù)庫(kù)的數(shù)據(jù)格式時(shí),數(shù)據(jù)庫(kù)要花費(fèi)不少代價(jià),因?yàn)槊恳粭l記錄里面鍵和值都要存,而且每次查詢都要進(jìn)行處理。這將意味著:

  • 數(shù)據(jù)庫(kù)引擎必須理解每個(gè)文檔的模式并處理它們,而不是處理常規(guī)元組和屬性(行和列)。
  • 必須解析和處理JSON中每個(gè)鍵值的數(shù)據(jù)類型
  • JSON可能是XML的一個(gè)精簡(jiǎn)的版本,但它依然很龐大。

雖然說(shuō)JSON作為一種數(shù)據(jù)庫(kù)的數(shù)據(jù)格式的效率不高,但是關(guān)鍵還是看你數(shù)據(jù)庫(kù)引擎怎么實(shí)現(xiàn),索引系統(tǒng)怎么實(shí)現(xiàn)。比如Mongodb的存儲(chǔ)格式是BSON,BSON是一種類JSON的二進(jìn)制形式的存儲(chǔ)格式,簡(jiǎn)稱Binary JSON。但是Mongodb的效率還是很高的。

②JSON沒(méi)有可執(zhí)行結(jié)構(gòu),毫無(wú)數(shù)據(jù)質(zhì)量可言
??JSON在數(shù)據(jù)庫(kù)中不要求數(shù)據(jù)結(jié)構(gòu),因此數(shù)據(jù)質(zhì)量差。自從JSON數(shù)據(jù)庫(kù)不要求任何結(jié)構(gòu),不管是有意還是無(wú)意,應(yīng)用程序都可以插入任何格式的數(shù)據(jù)流,只要這些數(shù)據(jù)是有效的JSON。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容