JSON(JavaScript Object Notation) 定义:字符串 键值对 解析方法有JSON,谷歌GSON,阿里巴巴FastJSON(推荐)

一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。

业内主流技术为其提供了完整的解决方案(有点类似于正则表达式,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。

JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。

Json建构于两种结构:
1.“名称/值”对的集合(A collection of name/value pairs):不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
ØJSON对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。
每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。如: {“name”:”jackson”, “age”:100}
 
2.值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)
Ø数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔
如:{  “students”:  [  {“name”:”jackson”,“age”:100},  {“name”:”michael”,”age”:51}  ]  }

JSON解析JSON数据时的重要方法

(1)JSONObject:

这是系统中有关JSON定义的基本单元,其包含一对(Key/Value)数值。

它对外部(External:应用toString()方法输出的数值)调用的响应体现为一个标准的字符串(例如:{“JSON”: “Hello, World”},最外被大括号包裹,其中的Key和Value被冒号”:”分隔)。

其对于内部(Internal)行为的操作格式略微,例如:初始化一个JSONObject实例,引用内部的put()方法添加数值:new JSONObject().put(“JSON”, “Hello, World!”),在Key和Value之间是以逗号”,”分隔。

Value的类型包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。

有两个不同的取值方法:

get(): 在确定数值存在的条件下使用,否则当无法检索到相关Key时,将会抛出一个Exception信息。

opt(): 这个方法相对比较灵活,当无法获取所指定数值时,将会返回一个默认数值,并不会抛出异常。

(2)JSONArray:

它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔(例如:[value1,value2,value3],大家可以亲自利用简短的代码更加直观的了解其格式)。这个类的内部同样具有查询行为,get()和opt()两种方法都可以通过index索引返回指定的数值,put()方法用来添加或者替换数值。

同样这个类的value类型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。

示例:服务器端生成json数据,客户端读取并解析json数据

(3)JSONStringer:

根据官方的解释,这个类可以帮助快速和便捷的创建JSONtext。其最大的优点在于可以减少由于格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntaxrules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。

根据下边的实例来了解其它相关信息:String myString = new JSONStringer().object() .key("name").value("小猪") .endObject().toString();

String myString = new JSONStringer().object()

.key("name")

.value("小猪")

.endObject()

.toString();
结果是一组标准格式的JSON text:{"name" : "小猪"}

其中的.object()和.endObject()必须同时使用,是为了按照Object标准给数值添加边界。同样,针对数组也有一组标准的方法来生成边界.array()和.endArray()。

示例1:
服务器端编写
1.首先导入json的各种包
2.JsonTools  如何将不同的数据类型如何生成json格式的字符串


3.JsonService  将person对象返回不同数据类型,供JsonTools  生成json

person

JsonService

4.TestJson 测试JsonTools  是否可以正常将JsonService 中返回的各种类型转换成json格式的字符串

5.JsonAction servlet 响应客户端的action  首先实例化JsonService 对象 并在init()方法中初始化该对象  doget做dopost的内容,并完善dopost

客户端编写

1.首先在清单文件中添加访问网络的授权

2.修改布局文件

3.为了访问服务器端数据,编写http工具类,将访问url返回的输入流转换成String返回

4.由于服务器端是将person对象按照不同的格式加工成json格式的字符串返回给客户端,而客户端需要将字符串解析出来还原成为一个相应格式的person对象,所以客户端也需要定义一个person类

5.重点编写json解析类JsonTools,完成解析,要求给方法一个key和一个json字符串,就按照要求还原出来

---------------------------------------

谷歌GSON技术

Gson这个Java类库可以把Java对象转换成JSON,也可以把JSON字符串转换成一个相等的Java对象。
Gson支持任意复杂Java对象包括没有源代码的对象。
示例2:
服务器端:在上例中修改部分代码
1.导入包
2.修改JsonTools  去掉key

3.JsonService  不变

4.修改action 因为gson的方法没有key值,所以得去掉

就这样 修改就完成了

客户端编写:

1.首先还是网络授权、并导入第三包

2.布局文件添加按钮

3.http、person同上

4.gsonTools 由于服务器生成json的时候没有key,所以与jsonTools不一样 gson.fromJson(jsonString, cls);或者gson.fromJson(jsonString);

使用到了反射的概念,服务器端和客户端解析和逆解析的对象都是同样的对象(在这里是person),使用jsonTools解析对象的时候,需要指明返回的类型,

但是使用gsonTools则采用泛型,使得gsonTools成为一个工具类,即不论服务器端返回何种类型的对象,客户端只要知道返回的类型都能进行解析,不用知道传递什么类型,也不用返回既定的类型

T指的是通用泛型,可以指任意的数据类型

4.mainactivity

 package com.android.gson;

 import java.util.List;
import java.util.Map; import com.android.gson.domain.Person;
import com.android.gson.gsonTools.GsonTools;
import com.android.gson.http.HttpUtils;
import com.example.android_05json_gson.R; import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; public class MainActivity extends Activity implements OnClickListener{
private Button person, persons, liststring, listmap;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
person = (Button) this.findViewById(R.id.person);
persons = (Button) this.findViewById(R.id.persons);
liststring = (Button) this.findViewById(R.id.liststring);
listmap = (Button) this.findViewById(R.id.listmap);
person.setOnClickListener(this);
persons.setOnClickListener(this);
liststring.setOnClickListener(this);
listmap.setOnClickListener(this);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
} @Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.person:
String path = "http://122.206.79.193:8080/gsonProject/servlet/JsonAction?action_flag=person";
String jsonString = HttpUtils.getJsonContent(path);
Person person=GsonTools.getPerson(jsonString, Person.class);
Log.i(TAG, person.toString());
break;
case R.id.persons:
String path2 = "http://122.206.79.193:8080/gsonProject/servlet/JsonAction?action_flag=persons";
String jsonString2 = HttpUtils.getJsonContent(path2);
List<Person> list=GsonTools.getPersons(jsonString2, Person.class);
Log.i(TAG, list.toString());
break;
case R.id.liststring:
String path3 = "http://122.206.79.193:8080/gsonProject/servlet/JsonAction?action_flag=liststring";
String jsonString3 = HttpUtils.getJsonContent(path3);
List<String> list3=GsonTools.getList(jsonString3);
Log.i(TAG, list3.toString());
break;
case R.id.listmap:
String path4 = "http://122.206.79.193:8080/gsonProject/servlet/JsonAction?action_flag=listmap";
String jsonString4 = HttpUtils.getJsonContent(path4);
List<Map<String,Object>> list4=GsonTools.listKeyMaps(jsonString4);
Log.i(TAG, list4.toString());
break;
}
}
}

---------------------------------------

阿里巴巴FastJson技术

ØFastJson是一个Json处理工具包,包括“序列化”和“反序列化”两部分,它具备如下特征:速度最快,测试表明,fastjson具有极快的性能,超越任其他的Java Json parser。包括自称最快的JackJson。功能强大,完全支持Java Bean、集合、Map、日期、Enum,支持范型,支持自省。无依赖,能够直接运行在Java SE 5.0以上版本.支持Android。开源 (Apache 2.0)

示例:只需要讲gson客户端稍加修改即可
1.首先卸载gson的包,并引用fastJson的包
2.FastJsonTools最不同,
返回单个对象:JSON.parseObject(jsonString, cls);
返回List<T>JSON.parseArray(jsonString, cls);

返回List<Map<String, Object>>JJSON.parseObject(jsonString,new TypeReference<List<Map<String, Object>>>() {});

 package com.android.gson.fastJsonTools;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference; ;
public class FastJsonTools { public FastJsonTools() {
// TODO Auto-generated constructor stub
} /**
* @param <T>
* @param jsonString
* @param cls
* @return单条数据单个javabean
*/
public static <T> T getPerson(String jsonString, Class<T> cls) {
T t = null;
try {
t = JSON.parseObject(jsonString, cls);
} catch (Exception e) {
// TODO: handle exception
}
return t;
} /**
* 使用Gson进行解析 List<Person>
*
* @param <T>
* @param jsonString
* @param cls
* @return
*/
public static <T> List<T> getPersons(String jsonString, Class<T> cls) {
List<T> list = new ArrayList<T>();
try {
list = JSON.parseArray(jsonString, cls);
} catch (Exception e) {
}
return list;
} public static List<Map<String, Object>> listKeyMaps(String jsonString) {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
try {
list = JSON.parseObject(jsonString,
new TypeReference<List<Map<String, Object>>>() {
});
} catch (Exception e) {
// TODO: handle exception
}
return list;
}
}

三种方式的对比:

方式 是否提供服务器端jsonString的生成方法 客户端JsonTools中的方法
JSON 是:JSONObject jsonObject = new JSONObject();

jsonObject.put(key, value);

解析成单个对象:方法参数为key和jsonString

JSONObject jsonObject = new JSONObject(jsonString);
JSONObject personObject = jsonObject.getJSONObject("person");

赋值之后 return对象;

解析成List<对象>:方法参数为key和jsonString

JSONObject jsonObject = new JSONObject(jsonString);
// 返回json的数组
JSONArray jsonArray = jsonObject.getJSONArray(key);

遍历并 list.add(对象)之后,返回list

解析成List<String>:方法参数为key和jsonString

JSONObject jsonObject = new JSONObject(jsonString);
JSONArray jsonArray = jsonObject.getJSONArray(key);

遍历并 list.add(对象)之后,返回list

解析成List<String>

List<Map<String, Object>> :方法参数为key和jsonString

JSONObject jsonObject = new JSONObject(jsonString);
JSONArray jsonArray = jsonObject.getJSONArray(key);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject2 = jsonArray.getJSONObject(i);

遍历jsonObject2 并 list.add(map)之后,返回list

谷歌GSON 是:

Gson gson = new Gson();
String gstr = gson.toJson(value);

 解析成单个对象:方法参数为String jsonString, Class<T> cls

Gson gson = new Gson();
t = gson.fromJson(jsonString, cls);

return t即可

 解析成List<对象>:方法参数为key和jsonString方法参数为String jsonString, Class<T> cls

Gson gson = new Gson();
list = gson.fromJson(jsonString, new TypeToken<List<T>>() {
}.getType());

return list;

 解析成List<String>:方法参数为jsonString

Gson gson = new Gson();
list = gson.fromJson(jsonString, new TypeToken<List<String>>() {
}.getType());

return list;

  解析成List<Map<String, Object>>

Gson gson = new Gson();
list = gson.fromJson(jsonString,
new TypeToken<List<Map<String, Object>>>() {
}.getType());

return list;

阿里巴巴FastJSON

解析成单个对象:方法参数为String jsonString和 Class<T> cls

t = JSON.parseObject(jsonString, cls);

return t即可

解析成List<T>  list = JSON.parseArray(jsonString, cls);

return list;

解析成List<Map<String, Object>>方法参数为String jsonString

list = JSON.parseObject(jsonString,
new TypeReference<List<Map<String, Object>>>() {
});

return list;

Android 之json解析的更多相关文章

  1. Android之JSON解析

    做个Android网络编程的同学一定对于JSON解析一点都不陌生,因为现在我们通过手机向服务器请求资源,服务器给我们返回的数据资源一般都是以JSON格式返回,当然还有一些通过XML格式返回,相对JSO ...

  2. Android项目--Json解析

    在过去的一段时间里,我希望做一个天气的应用,但是由于老版的天气接口已经不能用了.只能更新到2014年3月4日. 不过有些东西,哪来学习一下,也是可以的. 比如:http://m.weather.com ...

  3. 浅谈Android项目----JSON解析(4种解析技术详解)

    json简介 1.概念:json全称是javaScript object Notation,是一种并轻量级的数据交换格式. 2.特点: 1.本质就是具有特定格式的字符串 2.json完全独立于编程语言 ...

  4. Android 中Json解析的几种框架(Gson、Jackson、FastJson、LoganSquare)使用与对比

    介绍 移动互联网产品与服务器端通信的数据格式,如果没有特殊的需求的话,一般选择使用JSON格式,Android系统也原生的提供了JSON解析的API,但是它的速度很慢,而且没有提供简介方便的接口来提高 ...

  5. android通用JSON解析

    ackage cn.com.pcgroup.<a href="http://lib.csdn.net/base/15" class="replace_word&qu ...

  6. Android okHttp网络请求之Json解析

    前言: 前面两篇文章介绍了基于okHttp的post.get请求,以及文件的上传下载,今天主要介绍一下如何和Json解析一起使用?如何才能提高开发效率? okHttp相关文章地址: Android o ...

  7. android json解析及简单例子

    JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据 ...

  8. [Android]天气App 3 网络数据的请求和Json解析

      Android客户端开发,不仅仅是在Android端开发,还需要有相应的后台服务支持,否则的话,客户端的数据就只能放到本地自己做处理.我认为的原生态的App就是对应服务端的Client.他能像浏览 ...

  9. JSON解析之——Android

    JSON解析之——Android 一.google天气案例 之前xml学习中的google天气的例子非常形象,所以我们继续以google天气作为案例进行学习,下面是我从google官网下载下来的天气J ...

随机推荐

  1. 【Tomcat】Invalid character found in the request target

    Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC ...

  2. centos下搭建多项目svn服务器

    svn是多人协作开发中的利器,是一个开放源代码的版本控制系统. 相比与git,他的操作更加简单,windows下有优秀的图形界面,并且支持的文件类型比较多. 本文讲述如何在linux下搭建一个svn服 ...

  3. 七牛云数据存储Demo

    利用七牛云的Python SDK实现文件上传.下载等操作. import os import requests import qiniu from qiniu import BucketManager ...

  4. bam文件softclip , hardclip ,markduplicate的探究

      测序产生的bam文件,有一些reads在cigar值里显示存在softclip,有一些存在hardclip,究竟softclip和hardclip是怎么判断出来的,还有是怎么标记duplicate ...

  5. Mvc分页组件MvcSimplePager代码重构及使用

    1 Mvc分页组件MvcSimplePager代码重构 1.1 Intro 1.2 MvcSimplePager 代码优化 1.3 MvcSimplePager 使用 1.4 End Mvc分页组件M ...

  6. v-cloak 实现vue实例未编译完前不显示

    前言: 由于网速原因,(ps:之前同事无意间在网速很差的情况下测出的)在使用vue开发时,会由于vue实例还没编译成功的时候数据绑定的"Mustache"标签会闪现一下,造成不好的 ...

  7. mongodb 的服务启动和基本操作命令

    由于在dos 下操作mongodb 很不方便 所以我推荐大家使用mongodb 的可视化工具robomongo  这个是robomongo的下载网址 https://robomongo.org/dow ...

  8. MySQL存储引擎中的MyISAM和InnoDB区别

    MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然性能极佳,但却有一个缺点 ...

  9. Java:用Lambda表达式简化代码一例

    之前,调用第3方服务,每个方法都差不多“长”这样, 写起来啰嗦, 改起来麻烦, 还容易改漏. public void authorizeRoleToUser(Long userId, List< ...

  10. SVG渐变

    前面的话 给SVG元素应用填充和描边,除了使用纯色外,还可以使用渐变.本文将详细介绍SVG渐变 线性渐变 有两种类型的渐变:线性渐变和径向渐变.必须给渐变内容指定一个id属性,否则文档内的其他元素不能 ...