开发中对待数据处理时,往往用到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; } }