Android中JSONObject與JsonObject的區別


Android與服務器交互的時候,我們經常使用json格式的數據,使用較多的是JSONObject與JsonObject這兩個類,它們有什么區別呢?
我們先看一段代碼:

package com.example.testjson;

import org.json.JSONException;
import org.json.JSONObject;

import com.google.gson.JsonObject;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String sex = null;
        JSONObject js = new JSONObject();
        try {
            js.put("name", "zhangsan");
            js.put("age", "18");
            js.put("id", null);
            js.put("sex", sex);
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Log.e("JS-->", js.toString());

        String back = null;
        JsonObject js2 = new JsonObject();
        js2.addProperty("date", "20170911");
        js2.addProperty("price", "123");
        js2.addProperty("back", back);
        js2.add("go", null);
        Log.e("JS2-->", js2.toString());
    }
}

輸出Log:

09-13 14:44:33.233: E/JS-->(32072): {"name":"zhangsan","age":"18"}
09-13 14:44:33.243: E/JS2-->(32072): {"date":"20170911","price":"123","back":null,"go":null}

我們可以看出以下區別:
1.JSONObject是Android原生的json類,通過import org.json.JSONObject來導入。
JsonObject需要添加gson jar包,通過com.google.gson.JsonObject來導入。

2.查看源碼,可以看到
JSONObject通過HashMap來保存鍵值對。
JsonObject使用LinkedTreeMap來保存鍵值對。

JSONObject-Map

JsonObject-Map

3.JSONObject:添加value為null的鍵值對,Map保存的時候會刪掉這一鍵值對;
JsonObject:添加value為null的鍵值對,Map會保留value值是null的鍵值對。

在開發中使用JSONObject需要注意的是,如果保存了一個value值為null的鍵值對,在其它地方通過key來取值的時候,不會出現通過key取到值為null的情況。因為根本就沒有這個key所對應的鍵值對。

js.toString()的時候,由於使用的HashMap保存鍵值對,打印的鍵值對的順序與存放鍵值對的順序,並不完全一致。所以在某些字符串的順序,會影響生成的簽名的地方,會出現校驗通不過的情況。

以前在這兩個地方踩過坑,花了不少時間,希望大家在開發中注意這兩個問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM