JSON的定义:
一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。–Json.org
JSON Vs XML
1.JSON和XML的数据可读性基本相同
2.JSON和XML同样拥有丰富的解析手段
3.JSON相对于XML来讲,数据的体积小
4.JSON与JavaScript的交互更加方便
5.JSON对数据的描述性比XML较差
6.JSON的速度要远远快于XML
android2.3提供的json解析类
android的json解析部分都在包org.json下,主要有以下几个类:
JSONObject:可以看作是一个json对象,这是系统中有关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 。
JSONStringer:json文本构建类 ,根据官方的解释,这个类可以帮助快速和便捷的创建JSON text。其最大的优点在于可以减少由于 格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntax rules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON
text。。其最大的优点在于可以减少由于格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntax rules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。
JSONArray:它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔(例如:
[value1,value2,value3],大家可以亲自利用简短的代码更加直观的了解其格式)。这个类的内部同样具有查询行为, get()和opt()两种方法都可以通过index索引返回指定的数值,put()方法用来添加或者替换数值。同样这个类的value类型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL
object。
JSONTokener:json解析类
JSONException:json中用到的异常
JSONObject, JSONArray来构建json文本
-
-
-
-
-
-
-
-
-
-
try{
-
-
JSONObjectperson=newJSONObject();
-
-
JSONArrayphone=newJSONArray();
-
phone.put("12345678").put("87654321");
-
person.put("phone",phone);
-
-
person.put("name","yuanzhifei89");
-
person.put("age",100);
-
-
JSONObjectaddress=newJSONObject();
-
address.put("country","china");
-
address.put("province","jiangsu");
-
person.put("address",address);
-
person.put("married",false);
-
}catch(JSONExceptionex){
-
-
thrownewRuntimeException(ex);
-
}
getType和optType api的使用
getType可以将要获取的键的值转换为指定的类型,如果无法转换或没有值则抛出JSONException
optType也是将要获取的键的值转换为指定的类型,无法转换或没有值时返回用户提供或这默认提供的值
-
try{
-
-
-
phone.getLong(0);
-
person.getLong("name");
-
phone.optLong(0);
-
phone.optLong(0,1000);
-
person.optLong("name");
-
person.optLong("name",1000);
-
}catch(JSONExceptionex){
-
-
}
除了上面的两个类,还可以使用JSONStringer来构建json文本
Java代码
-
try{
-
JSONStringerjsonText=newJSONStringer();
-
//首先是{,对象开始。object和endObject必须配对使用
-
jsonText.object();
-
-
jsonText.key("phone");
-
//键phone的值是数组。array和endArray必须配对使用
-
jsonText.array();
-
jsonText.value("12345678").value("87654321");
-
jsonText.endArray();
-
-
jsonText.key("name");
-
jsonText.value("yuanzhifei89");
-
jsonText.key("age");
-
jsonText.value(100);
-
-
jsonText.key("address");
-
//键address的值是对象
-
jsonText.object();
-
jsonText.key("country");
-
jsonText.value("china");
-
jsonText.key("province");
-
jsonText.value("jiangsu");
-
jsonText.endObject();
-
-
jsonText.key("married");
-
jsonText.value(false);
-
-
//},对象结束
-
jsonText.endObject();
-
}catch(JSONExceptionex){
-
thrownewRuntimeException(ex);
-
}
json文本解析类JSONTokener
按照RFC4627规范将json文本解析为相应的对象。
对于将json文本解析为对象,只需要用到该类的两个api:
构造函数
public Object nextValue();
-
-
-
-
-
-
-
-
-
privatestaticfinalStringJSON=
-
"{"+
-
"\"phone\":[\"12345678\",\"87654321\"],"+
-
"\"name\":\"yuanzhifei89\","+
-
"\"age\":100,"+
-
"\"address\":{\"country\":\"china\",\"province\":\"jiangsu\"},"+
-
"\"married\":false,"+
-
"}";
-
-
try{
-
JSONTokenerjsonParser=newJSONTokener(JSON);
-
-
-
JSONObjectperson=(JSONObject)jsonParser.nextValue();
-
-
person.getJSONArray("phone");
-
person.getString("name");
-
person.getInt("age");
-
person.getJSONObject("address");
-
person.getBoolean("married");
-
}catch(JSONExceptionex){
-
-
}
其它的api基本就是用来查看json文本中的文本的
-
try{
-
JSONTokenerjsonParser=newJSONTokener(JSON);
-
-
jsonParser.next(8);
-
-
-
jsonParser.next();
-
-
-
jsonParser.nextClean();
-
-
-
jsonParser.nextString('a');
-
-
-
jsonParser.nextTo("0089");
-
-
-
jsonParser.back();
-
jsonParser.next();
-
-
-
jsonParser.skipPast("address");
-
jsonParser.next(8);
-
-
-
jsonParser.skipTo('m');
-
jsonParser.next(8);
-
}catch(JSONExceptionex){
-
-
}
以下是一个标准的JSON请求实现过程:
-
HttpPostrequest=newHttpPost(url);
-
-
JSONObjectparam=newJSONObject();
-
param.put("name","rarnu");
-
param.put("password","123456");
-
-
StringEntityse=newStringEntity(param.toString());
-
request.setEntity(se);
-
-
HttpResponsehttpResponse=newDefaultHttpClient().execute(request);
-
-
StringretSrc=EntityUtils.toString(httpResponse.getEntity());
-
-
JSONObjectresult=newJSONObject(retSrc);
-
Stringtoken=result.get("token");
下面这个是自己修改别人的小例子,主要是加一些注释和讲解,这个例子主要是使用android进行json解析。
-
单数据{'singer':{'id':01,'name':'tom','gender':'男'}}
-
多个数据{"singers":[
-
{'id':02,'name':'tom','gender':'男'},
-
{'id':03,'name':'jerry,'gender':'男'},
-
{'id':04,'name':'jim,'gender':'男'},
-
{'id':05,'name':'lily,'gender':'女'}]}
下面的类主要是解析单个数据parseJson()和多个数据的方法parseJsonMulti():
-
publicclassJsonActivityextendsActivity{
-
-
privateTextViewtvJson;
-
privateButtonbtnJson;
-
privateButtonbtnJsonMulti;
-
@Override
-
publicvoidonCreate(BundlesavedInstanceState){
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.main);
-
tvJson=(TextView)this.findViewById(R.id.tvJson);
-
btnJson=(Button)this.findViewById(R.id.btnJson);
-
btnJsonMulti=(Button)this.findViewById(R.id.btnJsonMulti);
-
btnJson.setOnClickListener(newView.OnClickListener(){
-
@Override
-
publicvoidonClick(Viewv){
-
-
-
StringstrUrl=ServerPageUtil.getStrUrl(UrlsOfServer.JSON_SINGER);
-
-
StringstrResult=connServerForResult(strUrl);
-
-
parseJson(strResult);
-
}
-
});
-
btnJsonMulti.setOnClickListener(newView.OnClickListener(){
-
@Override
-
publicvoidonClick(Viewv){
-
StringstrUrl=ServerPageUtil.getStrUrl(UrlsOfServer.JSON_SINGERS);
-
StringstrResult=connServerForResult(strUrl);
-
-
parseJsonMulti(strResult);
-
}
-
});
-
}
-
privateStringconnServerForResult(StringstrUrl){
-
-
HttpGethttpRequest=newHttpGet(strUrl);
-
StringstrResult="";
-
try{
-
-
HttpClienthttpClient=newDefaultHttpClient();
-
-
HttpResponsehttpResponse=httpClient.execute(httpRequest);
-
if(httpResponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
-
-
strResult=EntityUtils.toString(httpResponse.getEntity());
-
}
-
}catch(ClientProtocolExceptione){
-
tvJson.setText("protocolerror");
-
e.printStackTrace();
-
}catch(IOExceptione){
-
tvJson.setText("IOerror");
-
e.printStackTrace();
-
}
-
returnstrResult;
-
}
-
-
privatevoidparseJson(StringstrResult){
-
try{
-
JSONObjectjsonObj=newJSONObject(strResult).getJSONObject("singer");
-
intid=jsonObj.getInt("id");
-
Stringname=jsonObj.getString("name");
-
Stringgender=jsonObj.getString("gender");
-
tvJson.setText("ID号"+id+",姓名:"+name+",性别:"+gender);
-
}catch(JSONExceptione){
-
System.out.println("Jsonparseerror");
-
e.printStackTrace();
-
}
-
}
-
-
privatevoidparseJsonMulti(StringstrResult){
-
try{
-
JSONArrayjsonObjs=newJSONObject(strResult).getJSONArray("singers");
-
Strings="";
-
for(inti=0;i<jsonObjs.length();i++){
-
JSONObjectjsonObj=((JSONObject)jsonObjs.opt(i))
-
.getJSONObject("singer");
-
intid=jsonObj.getInt("id");
-
Stringname=jsonObj.getString("name");
-
Stringgender=jsonObj.getString("gender");
-
s+="ID号"+id+",姓名:"+name+",性别:"+gender+"\n";
-
}
-
tvJson.setText(s);
-
}catch(JSONExceptione){
-
System.out.println("Jsonsparseerror!");
-
e.printStackTrace();
-
}
-
}
-
}
原文地址:http://blog.csdn.net/onlyonecoder/article/details/8489803
分享到:
相关推荐
完成json 基本结构(键值对、对象、数组、字符串)的解析, 完成对true、false、null、整数的解析, 完成浮点数的解析; 完成科学计数法表示的数的解析; 完成json 文本的格式化。添加一个命令行参数-pretty,对于...
C#对多级json解析,非常实用,此代码写在load事件里面,然后可以了解解析json的原理。尤其是多级解析。
本着探究 JSON 原理的目的,我将会在这DEMO中实现了一个简单的JSON解析器。由于 JSON 本身比较简单,解析起来也并不复杂。所以如果大家感兴趣的话,在看完本DEMO后,不妨自己动手实现一个 JSON 解析器。
Java实现自己的Json解析器——Json字符串解析原理 根据提取到的字符,转入不同的解析方法中, 例如字符是t,说明值可能是true,只需检查后面三个字符,如果是r、u、e,则可以直接返回true。 字符是f,说明值可能是...
原理:用时创建的规则降低传统解析器一次性将文本转成Java对象而占用大量内存空间,通过注册Filter并判断自己关注的KEY/VALUE来有选择的创建Java对象或JsonLazyer子对象。 使用方法可以查看jar包中的Sample.java示例...
jsonpath 用于多层嵌套 json格式的 解析。 pip install jsonpath JsonPath 描述 $ 根节点 @ 现行节点 .or[] 取子节点 n/a 取父节点,jsonpath为支持 .. 就是不管位置,选择所有复合条件的条件 * ...
jackson框架解析json,主要讲解了怎样解析Bean,List,Map,Bean>,List,Bean>>类型的json
一、JSON格式介绍 ...本着探究 JSON 原理的目的,我将会在这篇文章中详细向大家介绍一个简单的JSON解析器的解析流程和实现细节。由于 JSON 本身比较简单,解析起来也并不复杂。所以如果大家感兴趣的话
基本原理JSON解析器不仅解析JSON,而且还提供使用它的API。解析后,您必须遍历其数组,在对象中查找值,并最终提取字符串,浮点数等。 JSON基准通常仅测量解析器读取JSON文件所花费的时间。即使对于将JSON读取到树中...
学习SpringMVC处理JSON数据的具体实现和基本原理,同时会使用HttpMessageConverter
主要介绍了Python Json数据文件操作原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
JSON 比 XML 更小、更快,更易解析。 和 XML 一样,JSON 也是基于纯文本的数据格式。由于 JSON 天生是为 JavaScript 准备的,因此,JSON 的数据格式非常简单,您可以用 JSON 传输一个简单的 String,Number,...
1.json与jsonp的引入 在ajax中 JSON用来解决数据交换问题,而JSONP来实现跨域。 备注:跨域也可以通过服务器端代理来解决; 理解:JSON是一种数据交换格式,而JSONP是一种依靠开发人员的聪明才智创造出的一种非官方...
简单 清除 讲解android json 解析原理
主要介绍了基于java解析JSON的三种方式,结合实例形式详细分析了json解析的原理与GSON、FastJSON等常用解析操作技巧,需要的朋友可以参考下
主要介绍了JsonFormat与@DateTimeFormat注解实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
MSX JSON解析器 一个小型库,用于在MSX BASIC下解析JSON文件。 基本原理 MSX有很多可用的网络墨盒。 您可能希望使用它们连接到我们周围的许多REST端点,但大多数仅以JSON进行通信。 该库提供了JSON解析功能来填补这...
无损-json 解析 JSON 而不会有丢失数字信息的风险。 let text = '{"normal":2.3,"long":123456789012345678901,"big":2.3e+500}' ;// JSON.parse will lose some digits and a whole number:console . log ( JSON . ...
JSON.stringify() 方法用于将 JavaScript 值转换为 JSON 字符串。 语法 JSON.stringify(value[, replacer[, space]]) 参数说明: value: 必需, 要转换的 JavaScript 值(通常为对象或数组)。 replacer: 可选。...