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());
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

输出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
  • 2

我们可以看出以下区别: 
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保存键值对,打印的键值对的顺序与存放键值对的顺序,并不完全一致。所以在某些字符串的顺序,会影响生成的签名的地方,会出现校验通不过的情况。

以前在这两个地方踩过坑,花了不少时间,希望大家在开发中注意这两个问题。


猜你喜欢

转载自blog.csdn.net/u011368551/article/details/80503605
今日推荐