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

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

  • 相关阅读:
    单元测试,集成测试与系统测试
    关于 单窗口服务模型模拟 进行的小测试
    软件测试新随笔
    白盒测试
    黑盒测试小实验
    JUnit框架初次体验
    等价类划分进阶篇
    等价类划分
    因果图法测试小例
    android中将EditText改成不可编辑的状态
  • 原文地址:https://www.cnblogs.com/lishbo/p/9956037.html
Copyright © 2020-2023  润新知