json理解及使用

    xiaoxiao2021-12-14  20

    开发中对待数据处理时,往往用到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具有以下这些形式:

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

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

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

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

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

    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; } }
    转载请注明原文地址: https://ju.6miu.com/read-962432.html

    最新回复(0)