json-lib的使用《二》
上篇文章主要集中在了使用json-lib来实现JSON字符串和java中的对象的互转上,忽视了json-lib本身的功能,json-lib中有两个类比较重要:JSONObject和JSONArray,这两个类因其名称不同,所实现的功能也不尽相同,JSONObject处理的是对象格式的({}),JSONArray处理的是数组格式的([]),下面看具体的使用方法。
JSONObject
一、源码
JSONObject类中有多个重载的element(),此方法是向JSONObject类中存储数据的方法,通过查看源代码,发现JSONObject是通过Map实现数据存储的,看下面的源码,
private Map properties; /**
* Construct an empty JSONObject.
*/
public JSONObject() {
this.properties = new ListOrderedMap();
}
在JSONObject中有Map属性,此属性是一个ListOrderMap的对象,element()方法则是向properties中添加数据,因为properties是map,则可以使用操作Map的方法操作properties属性,JSONObject对properties的操作方式进行了包装;从源码中可以发现还有好多重载的get()方法,如,
public Object get( String key ) {
verifyIsNull();
return this.properties.get( key );
}
从get方法中可以看出使用的便是Map的get方法。
经过以上的源码分析,可以知道对JSONObject的操作即是对Map的操作。
二、使用
public static void TestJSONObject(){
//创建一个JSONObject对象
JSONObject jsonObject=new JSONObject();
jsonObject.element("my", "this is my first");
String str=jsonObject.toString();
String keyValue=jsonObject.getString("my");
System.out.println("str:"+str);
System.out.println("keyValue:"+keyValue);
}
打印结果,
str:{"my":"this is my first"}
keyValue:this is my first
有了JSONObject实例之后,使用element()方法把键和键对应的值添加进去,打印出字符串可以看出是JSON对象的格式,可以看出这种形式和把一个类转化为JSON格式的字符串是一致的,可以把“my”当做是类的属性,“this is my first”是属性的值。
有了这样的理解之后,可以把一个JSON字符串转化为一个JSONObjec对象,然后取得对象中的值,如下,
public static void getValue(){
String str="{\"my\":\"this is my first\",\"second\":\"this is second!\"}";
JSONObject jsonObject=JSONObject.fromObject(str);
String my=jsonObject.getString("my");
String second=jsonObject.getString("second");
System.out.println("my:"+my);
System.out.println("secode:"+second);
}
打印结果如下,
my:this is my first
secode:this is second!
可以看出我们完全可以不把JSON字符串转化为相应的类,同样可以获得想要的值,如果要转化为相应的类,必须要有如下的类,
package com.cn.study.day3;
public class TestAndMy {
private String my;
private String second;
public String getMy() {
return my;
}
public void setMy(String my) {
this.my = my;
}
public String getSecond() {
return second;
}
public void setSecond(String second) {
this.second = second;
}
}
生成类的代码如下,
public static void getValue(){
String str="{\"my\":\"this is my first\",\"second\":\"this is second!\"}";
JSONObject jsonObject=JSONObject.fromObject(str);
String my=jsonObject.getString("my");
String second=jsonObject.getString("second");
System.out.println("my:"+my);
System.out.println("secode:"+second);
System.out.println("-------------------------------");
//生成类
TestAndMy test=(TestAndMy)jsonObject.toBean(jsonObject, TestAndMy.class);
System.out.println("my:"+test.getMy()+",second:"+test.getSecond());
}
在有些情况下,可能不是这种简单的字符串,而是比较复杂的,我们应该如何取得想要的值呢,看下面的例子,
public static void complex(){
String str="{\"data\":{\"my\":\"this is my first\",\"second\":\"this is second!\"}}";
JSONObject jsonObject=JSONObject.fromObject(str);
JSONObject dataObject=jsonObject.getJSONObject("data");
System.out.println("dd:"+dataObject.toString());
}
打印结果,
dd:{"my":"this is my first","second":"this is second!"}
在上边的例子中不再是一个JSON对象,而是data对应一个JSON对象,在获得了JSONObject实例之后,我们知道一个JSONObject实例,其底层存储是Map的,那么使用get方法可以获得其键对应的值,可以使用get(String key)方法,此方法返回一个Object对象,返回Object对象之后就不好处理了,此种方法行不通,可以使用getString(String key),此方法是返回key对应的值的字符串形式,那么针对上边的例子,我们返回的应该是{"my":"this is my first","second":"this is second!"},还是达不到最终解析的目的。最终发现使用getJSONObject(String key)方法可以,返回的是JSONObject的对象,那么我们可以接着使用此对象进行完全解析。
JSONArray
一、源码
查看JSONArray的源码,可以发现JSONArray的底层是List实现的,即使用JSONArray对象存储数据是放在List中的,
/**
* The List where the JSONArray's properties are kept.
*/
private List elements;
/** * Construct an empty JSONArray. */
public JSONArray() { this.elements = new ArrayList(); }
JSONArray中所有的值都是放在elements中的,elements又是ArrayList的一个实例。ArrayList底层是通过数组实现的。那么对于JSONArray的操作就是基于数组的。
JSONArray提供了重载的element()方法,用来新增数据,提供了重载的get()方法来取出数据
二、使用
下面是一个使用JSONArray的例子,
public static void testJSONArray(){
String array="[\"123\",\"this is my test\",{\"address\":\"北京市朝阳区\",\"age\":\"23\",\"name\":\"JSON\"}]";
JSONArray jsonArray=JSONArray.fromObject(array);
//由于JSONArray底层是数组,所以这里使用下标的方式来访问其中的元素
String str1=jsonArray.getString(0);
String str2=jsonArray.getString(1);
String str3=jsonArray.getString(2);
System.out.println("str1:"+str1+",str2:"+str2+",str3:"+str3);
//由于第三个元素本身是一个对象形式的JSON串,可以这样获得第三个元素
JSONObject o3=jsonArray.getJSONObject(2);//获得JSONObject对象
System.out.println("address:"+o3.getString("address")+",age:"+o3.getString("age"));
}
打印结果为,
str1:123,str2:this is my test,str3:{"address":"北京市朝阳区","age":"23","name":"JSON"}
address:北京市朝阳区,age:23
由于JOSNArray是由ArrayList实现的,所有这里是使用getString()方法,可以获得每个索引处的字符串,但是无法做到完全解析此字符串的目的,所以可以使用getJSONObject()方法获得第三个位置的对象,然后解析此对象。
从上边的叙述中可以JSONArray、JOSNObject两个类都可以存储数据,只是使用的方式不同,正是这种不同造成了解析方式不同。
有不正之处,欢迎指出,谢谢!
json-lib的使用《二》的更多相关文章
- Json lib集成stucts2的使用方法 抛出 NestableRuntimeException异常的解决办法
首先贴出struts 2.3.16需要导入的包 因为使用的是2.3 版本,必须要导入这个包,否则会报java.lang.NoClassDefFoundError: org/apache/commons ...
- 使用JsonConfig控制JSON lib序列化
将对象转换成字符串,是非常常用的功能,尤其在WEB应用中,使用 JSON lib 能够便捷地完成这项工作.JSON lib能够将Java对象转成json格式的字符串,也可以将Java对象转换成xml格 ...
- Atitit.json类库的设计与实现 ati json lib
Atitit.json类库的设计与实现 ati json lib 1. 目前jsonlib库可能有问题,可能版本冲突,抛出ex1 2. 解决之道:1 2.1. 自定义json解析库,使用多个复合的js ...
- 多叉树结构:JSON数据解析(二)
多叉树结构:JSON数据解析(二) 在上篇文章中提到了JSON数据解析的基本方法,但是方法效率太低,这里接着上篇文章写写如何利用多叉树结构,定义对象,实现JSON数据字段快速随机访问. JSON数据通 ...
- JSON lib 里JsonConfig详解
一,setCycleDetectionStrategy 防止自包含 /** * 这里测试如果含有自包含的时候需要CycleDetectionStrategy */ public static void ...
- Java中的List转换成JSON报错(二)
1.错误描述 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/loggi ...
- Json-lib 进行java与json字符串转换之二
二.list和json字符串的互转 list-->>json字符串 public static void listToJSON(){ Student stu=new Student(); ...
- Java创建和解析Json数据方法(二)——org.json包的使用
(二)org.json包的使用 1.简介 工具包org.json.jar,是一个轻量级的,JAVA下的json构造和解析工具包,它还包含JSON与XML, HTTP headers, Cookie ...
- JSON转换类(二)--List转换成Json、对象集合转换Json等
#region List转换成Json /// <summary> /// List转换成Json /// </summary> public static string Li ...
- Ajax+JSON学习笔记(二)
来源:http://www.imooc.com/learn/250 readyState属性 0:请求未初始化,open还没有调用 1:服务器连接已建立,open已经调用了 2:请求已接受,也就是接收 ...
随机推荐
- 《Entity Framework 6 Recipes》中文翻译系列 (35) ------ 第六章 继承与建模高级应用之TPH继承映射中使用复合条件
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-11 TPH继承映射中使用复合条件 问题 你想使用TPH为一张表建模,建模中使 ...
- Attribute富文本使用方法
★★★Attribut富文本★★★ 在UITextView和UILable的使用中很多的时候会用到富文本. UITextView和UILable的区别在于: ★★★★UITextView 当文字大于一 ...
- Android-简单的图片验证码
Android-图片验证码生成1.为啥要验证码?图片验证码在网络中使用的是比较普遍的.一般都是用来防止恶意破解密码.刷票.论坛灌水.刷页等.2.怎样的验证码比较好?验证码的获取方式无非就两种,一种是后 ...
- AngularJs入门之表单开发
本文和大家分享的主要是前端开发中必备的AngularJs框架表单开发相关基础知识,希望对大家使用和学习AngularJs有所帮助. 1.简单的表单提交: 2.更多的表单元素: 3.初始化表单: 代码 ...
- HTML的页面IE注释
我们常常会在网页的HTML里面看到形如[if lte IE 9]……[endif]的代码,表示的是限定某些浏览器版本才能执行的语句,那么这些判断语句的规则是什么呢?请看下文: <!--[if ! ...
- 【转】SQL删除重复数据方法,留着备用
感谢孙潇楠前辈的总结,地址http://www.cnblogs.com/sunxiaonan/archive/2009/11/24/1609439.html 例如: id name ...
- BAT及各大互联网公司2014前端笔试面试题--JavaScript篇
很多面试题是我自己面试BAT亲身经历碰到的.整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者,对于巩固复习js更是大有裨益. 而更多的题目是我一路以来收集的,也有往年的,答案不确保一定正确, ...
- MySQL学习笔记十一:数据导入与导出
数据导入 1.mysqlimport命令行导入数据 在使用mysqlimport命令导入数据时,数据来源文件名要和目标表一致,不想改文件名的话,可以复制一份创建临时文件,示例如下. 建立一个文本use ...
- WebStorm文件类型关联设置
无意中创造了一个没有扩展名的文件,我选择了错误的文件类型关联.是js类型的,我却选成了文本,Ws每次编辑类型就成了txt文本,这个问题让我很苦恼,以下是我的解决方案. 错选的弹出框如下: 解决方案如下 ...
- ANNOTATION PROCESSING 101 by Hannes Dorfmann — 10 Jan 2015
原文地址:http://hannesdorfmann.com/annotation-processing/annotationprocessing101 In this blog entry I wo ...