一、JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。
二、JSON的两种结构:
1、“名称/值”对的集合。
2、值的有序列表,一般称为数组。
JSON具有以下这些形式:
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
值(value)可以是双引号括起来的字符串(string)、数值(number)、true
、false
、 null
、对象(object)或者数组(array)。这些结构可以嵌套。
字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。
字符串(string)与C或者Java的字符串非常相似。
数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
空白可以加入到任何符号之间。
以上 – Json.org。
三、JSON的复杂结构。
这里有某个网站返回数据如下:
{"showapi_res_code":0,"showapi_res_error":"","showapi_res_body":{"list":[{"p0":"6.07","p90":"6.4","p93":"6.5","p97":"6.94","prov":"辽宁"}],"ret_code":0}}
其数据结构如下
在Java中生成此数据,可以更好的理解JSON的数据结构。
代码如下:
先定义个Prov类:
package com.example.test; public class Prov { private String p0, p90, p93, p97,prov; //每个变量的名字和网站得到的JSON数据的名字对应,否则不能正确解析数据。生成的数据格式一样,但 名称/值 中的名称不一样。 public String getProv() { return prov; } public void setProv(String prov) { this.prov = prov; } public String getP0() { return p0; } public void setP0(String p0) { this.p0 = p0; } public String getP90() { return p90; } public void setP90(String p90) { this.p90 = p90; } public String getP93() { return p93; } public void setP93(String p93) { this.p93 = p93; } public String getP97() { return p97; } public void setP97(String p97) { this.p97 = p97; } }
其上一层的Body类:
package com.example.test; import java.util.List; public class Body { private String ret_code; private List<com.example.test.Prov> list;//这里名字用list,和网站得到的JSON数据对应名字。否则格式生成的数据格式一样,但名字一样。解析JSON数据时,也不能正确解析。 public String getRet_code() { return ret_code; } public void setRet_code(String ret_code) { this.ret_code = ret_code; } public List<com.example.test.Prov> getProv() { return list; } public void setProv(List<com.example.test.Prov> prov) { this.list = prov; } }
再上一层的数据ListData类
package com.example.test; public class ListData { //同上面两个相同,定义变量的名字要和JSON里的一致。 private String showapi_res_code,showapi_res_error; private Body showapi_res_body; public String getShowapi_res_code() { return showapi_res_code; } public void setShowapi_res_code(String showapi_res_code) { this.showapi_res_code = showapi_res_code; } public String getShowapi_res_error() { return showapi_res_error; } public void setShowapi_res_error(String showapi_res_error) { this.showapi_res_error = showapi_res_error; } public Body getShowapi_res_body() { return showapi_res_body; } public void setShowapi_res_body(Body showapi_res_body) { this.showapi_res_body = showapi_res_body; } }
最好,在main中处理JSON数据
package com.example.test; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.Button; import android.widget.TextView; import com.google.gson.Gson; import com.show.api.ShowApiRequest; public class MainActivity extends Activity implements OnClickListener { private Button btn; private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textview); btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(this); String res = new ShowApiRequest("http://route.showapi.com/138-46", "1255", "9b8cc3f4086048b8a506d731d1af0a9c") .addTextPara("prov", "辽宁").post(); System.out.println(res); // ------------将对象专程JSON数据---开始 com.example.test.Prov prov = new com.example.test.Prov(); prov.setP0("6.07"); prov.setP90("6.4"); prov.setP93("6.5"); prov.setP97("6.97"); prov.setProv("辽宁"); List<com.example.test.Prov> provlist = new ArrayList<com.example.test.Prov>(); provlist.add(prov); Body body = new Body(); body.setRet_code("0"); body.setProv(provlist); ListData listData = new ListData(); listData.setShowapi_res_body(body); listData.setShowapi_res_error(""); listData.setShowapi_res_code("0"); Gson gson = new Gson(); String s = gson.toJson(listData); System.out.println(s); // ------------将对象专程JSON数据---结束 // ----------------解析JSON数据 ---开始 ListData listDatas = gson.fromJson(res, ListData.class); String showapi_res_code = listDatas.getShowapi_res_code(); String showapi_res_error = listDatas.getShowapi_res_error(); Body body2 = listDatas.getShowapi_res_body(); System.out.println("showapi_res_code = " + showapi_res_code + " " + "showapi_res_error = " + showapi_res_error + " ret_code=" + body2.getRet_code()); List<Prov> prov2 = body2.getProv(); for (Prov prov1 : prov2) { System.out.println(prov1.getP93() + " " + prov1.getProv()); } // ----------------------解析JSON数据结束 } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn: textView.setText("a"); break; default: break; } } }