标签:
作用:网络传输格式。
JSON 语法规则
JSON 语法是 JavaScript 对象表示语法的子集。
JSON 名称/值对
JSON 数据的书写格式是:名称/值对。
基础结构 --> 重点
json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构
1、对象:对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。
2、数组:数组在js中是中括号“[]”括起来的内容,数据结构为 ["java","javascript","vb",...],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。
经过对象、数组2种结构就可以组合成复杂的数据结构了。
步骤:
1.搭建服务器,给Json数据。
2.解析数据。
详细步骤:
1.搭建服务器,给Json数据。
[{"id":"5","version":"5.5","name":"Angry Birds"},
{"id":"6","version":"7.0","name":"Clash of Clans"},
{"id":"7","version":"3.5","name":"Hey Day"}]
2.解析数据。
try { // 数组的解析 JSONArray jsonArray = new JSONArray(jsonData); for (int i = 0; i < jsonArray.length(); i++) { // 对象的解析 JSONObject jsonObject = jsonArray.getJSONObject(i); String id = jsonObject.getString("id"); String name = jsonObject.getString("name"); String version = jsonObject.getString("version"); Log.d("h_bl", "id is " + id); Log.d("h_bl", "name is " + name); Log.d("h_bl", "version " + version); } } catch (Exception e) { e.printStackTrace(); }
详细代码:
@SuppressLint("HandlerLeak")
public class MainActivity extends Activity implements OnClickListener {
private Button bt_getData;
private TextView tv_show_data;
private static final int GET_DATA_OK = 0;
// Handler机种更新UI
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case GET_DATA_OK:
String data = (String) msg.obj;
tv_show_data.setText(data);
break;
default:
break;
}
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
bt_getData = (Button) findViewById(R.id.bt_getData);
tv_show_data = (TextView) findViewById(R.id.tv_show_data);
bt_getData.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_getData:
getData();
break;
default:
break;
}
}
/**
* 获取数据
*/
private void getData() {
new Thread(new Runnable() {
@Override
public void run() {
Log.d("h_bl", "进入执行");
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("http://h-bolin.imwork.net/SendJsonData/SendJson.json");
HttpResponse httpResponse = null;
try {
httpResponse = httpClient.execute(httpGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
// 请求和响应都成功了
Log.d("h_bl", "响应成功");
HttpEntity entity = httpResponse.getEntity();
String response = EntityUtils.toString(entity, "utf-8");
parseJSONWithJSONObject(response);
Message message = new Message();
message.what = GET_DATA_OK;
// 将服务器返回的结果存放到Message中
message.obj = response.toString();
handler.sendMessage(message);
}
} catch (ClientProtocolException e) {
Log.d("h_bl", "链接失败");
e.printStackTrace();
} catch (IOException e) {
Log.d("h_bl", "链接IO异常");
e.printStackTrace();
}
}
}).start();
}
private void parseJSONWithJSONObject(String jsonData) {
try {
// 数组的解析
JSONArray jsonArray = new JSONArray(jsonData);
for (int i = 0; i < jsonArray.length(); i++) {
// 对象的解析
JSONObject jsonObject = jsonArray.getJSONObject(i);
String id = jsonObject.getString("id");
String name = jsonObject.getString("name");
String version = jsonObject.getString("version");
Log.d("h_bl", "id is " + id);
Log.d("h_bl", "name is " + name);
Log.d("h_bl", "version " + version);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
GSON的使用:
1.对象
比如说一段 JSON 格式的数据如下所示:
{"name":"Tom","age":20}
那我们就可以定义一个 Person 类,并加入 name 和 age 这两个字段,然后只需简单地调
用如下代码就可以将 JSON 数据自动解析成一个 Person 对象了:
Gson gson = new Gson(); Person person = gson.fromJson(jsonData, Person.class);
2.数组
JSON 数组需要借助 TypeToken 将期望解析成的数据类型传入到 fromJson()方法中,如下所示:
Gson gson = new Gson();
List<Person> people = gson.fromJson(jsonData, new TypeToken<List<Person>>(){}.getType());
TypeToken:
由于Java泛型的实现机制,使用了泛型的代码在运行期间相关的泛型参数的类型会被擦除,我们无法在运行期间获知泛型参数的具体类型(所有的泛型类型在运行时都是Object类型)。
但是有的时候,我们确实需要获知泛型参数的类型,比如将使用了泛型的Java代码序列化或者反序列化的时候,这个时候问题就变得比较棘手。
由于在运行期间无法得知泛型参数的类型,对这个类的对象进行序列化和反序列化都不能正常进行。Gson通过借助TypeToken类来解决这个问题。
只要将需要获取类型的泛型类作为TypeToken的泛型参数构造一个匿名的子类,就可以通过getType()方法获取到我们使用的泛型类的泛型参数类型。
详见:
http://www.cnblogs.com/qq78292959/p/3781814.html
标签:
原文地址:http://www.cnblogs.com/H-BolinBlog/p/5264150.html