json理解及使用

来源:互联网 发布:php array 转 object 编辑:程序博客网 时间:2024/06/14 02:18

开发中对待数据处理时,往往用到json.类似于

{"employees": [{ "name":"Bill.Gates" ,"age":18,"sex":0},{ "name":"Taylor.Swift" ,"age":18,"sex":1},{ "name":"Thomas.Carter","age":18,"sex":0}]}

这样的数据结构,服务器端或者客户端需要解析或者构建这样的数据。那么,json到底是什么鬼?
官方描述:

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。

也就是说,原本它是JavaScript的一种对象表示法,但是它独立于语言,即可以在多种语言中使用;它是一种数据交换方式(或者称之为数据交流更合适)。因为它具有易于机器理解生成和人的阅读编写,结构清晰,使用方便,故在多种语言中作为经常使用的数据结构。

JSON建构于两种结构(即对象和数组):

  • “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash
    table),有键列表(keyed list),或者关联数组 (associative array)。

  • 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

JSON具有以下这些形式:

对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
图1

数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
图2

值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
图3
字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。

字符串(string)与C或者Java的字符串非常相似。
图4

数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
图5

JSON 语法规则 JSON 语法:

  • 数据在名称/值对中
  • 数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组

光说不练,等于扯淡。
以json在Android中使用为例实践。
比如 需要这样的数据形式

{    "flag": true,    "data": [        {            "name": "zhangsan",            "uid": "00022"        },        {            "name": "lisi",            "uid": "00023"        },        {            "name": "wangwu",            "uid": "00024"        },        {            "name": "maliu",            "uid": "00025"        },        {            "name": "maya",            "uid": "00080"        }    ]}

如果是Android端如何构建这样的数据呢?
我们用到jsonarray jsonobject
jsonarray 表示json数组
jsonobject 表示json对象

JSONArray jsonarray = new JSONArray();
jsonarray.put(“zhangsan”);
那么显示的是[“zhangsan”],即内容为”zhangsan”的数组
JSONObject obj = new JSONObject();
object.put(“李四”);
那么显示的是{“李四”},即内容为”李四”的对象

所以通过分析我们得出需要组织的数据结构
外层是一个对象 {}
对象中 2类数据,一个普通键值对 “flag”: true,一个职位数组的键值对 :
“data”: [
{
“name”: “zhangsan”,
“uid”: “00022”
},
{
“name”: “lisi”,
“uid”: “00023”
},
{
“name”: “wangwu”,
“uid”: “00024”
},
{
“name”: “maliu”,
“uid”: “00025”
},
{
“name”: “maya”,
“uid”: “00080”
}
]

此时数组中有6个对象
分析到此构建我们就心中有数了

首先我们需要建一个People类

public class People implements Serializable {String name;String uid;public String getName() {    return name;}public void setName(String name) {    this.name = name;}public String getUid() {    return uid;}public void setUid(String uid) {    this.uid = uid;}

}

把数据先放入数组

String[] name = {"zhangsan", "lisi", "wangwu", "maliu", "maya"};String[] uid = {"00022", "00023", "00024", "00025", "00080"};

放入list

List<People> pList = new ArrayList<>();for (int i = 0; i < name.length; i++) {            People p = new People();            p.setUid(uid[i]);            p.setName(name[i]);            pList.add(p);  }//建jsonarray jsonobject 对象JSONArray jsonarray = new JSONArray();JSONObject j = null;//循环放入数据到jsonarray  try {            for (int i = 0; i < pList.size(); i++) {                JSONObject object = new JSONObject();                object.put("name", pList.get(i).getName());                object.put("uid", pList.get(i).getUid());                jsonarray.put(object);            }//拼出需要的格式            j = new JSONObject();            j.put("flag", true);            j.put("data", jsonarray);            Log.i("Json", j.toString());        } catch (JSONException e) {            e.printStackTrace();        }

怎么解析数据呢?刚才的分析逆推就是了

//解析json
List parseData(String mData) {

    List<People> pList = new ArrayList<>();    try {        JSONObject obj = new JSONObject(mData);        flag = obj.optBoolean("flag");        JSONArray jary = obj.optJSONArray("data");        for (int j = 0; j < jary.length(); j++) {            JSONObject jt = jary.getJSONObject(j);            String name = jt.optString("name");            String uid = jt.optString("uid");            People people = new People();            people.setName(name);            people.setUid(uid);            pList.add(people);        }    } catch (JSONException e) {        e.printStackTrace();    }    return pList;}

android 完整代码:

public class MainActivity extends AppCompatActivity {    boolean flag;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        String str = createJsonData();        List<People> plt = parseData(str);        StringBuffer sb = new StringBuffer();        for (int i = 0; i < plt.size(); i++) {            sb =sb.append("第"+i+"项:"+plt.get(i).getName()+"、").append(plt.get(i).getUid()+"\n");        }       TextView tv = (TextView) findViewById(R.id.tv);        tv.setText(sb.toString());    }    //组装json    String createJsonData() {        String[] name = {"zhangsan", "lisi", "wangwu", "maliu", "maya"};        String[] uid = {"00022", "00023", "00024", "00025", "00080"};        List<People> pList = new ArrayList<>();        for (int i = 0; i < name.length; i++) {            People p = new People();            p.setUid(uid[i]);            p.setName(name[i]);            pList.add(p);        }        JSONArray jsonarray = new JSONArray();        JSONObject j = null;        try {            for (int i = 0; i < pList.size(); i++) {                JSONObject object = new JSONObject();                object.put("name", pList.get(i).getName());                object.put("uid", pList.get(i).getUid());                jsonarray.put(object);            }            j = new JSONObject();            j.put("flag", true);            j.put("data", jsonarray);            Log.i("Json", j.toString());        } catch (JSONException e) {            e.printStackTrace();        }        return j.toString();    }    //解析json    List<People> parseData(String mData) {        List<People> pList = new ArrayList<>();        try {            JSONObject obj = new JSONObject(mData);            flag = obj.optBoolean("flag");            JSONArray jary = obj.optJSONArray("data");            for (int j = 0; j < jary.length(); j++) {                JSONObject jt = jary.getJSONObject(j);                String name = jt.optString("name");                String uid = jt.optString("uid");                People people = new People();                people.setName(name);                people.setUid(uid);                pList.add(people);            }        } catch (JSONException e) {            e.printStackTrace();        }        return pList;    }}
1 0
原创粉丝点击