JSONObject基本内容(三)
参考资料:http://swiftlet.net/archives/category/json 十分感谢!!!~~
第三篇的内容,主要讲述的有两点: 1 .如何获取JSONObject中对应key的value。 2.如何把JSONObject转换为javaBean对象。
一)获取JSONObject中属性值
首先我们写一个javaBean类
public class Emp {
private String name;
private Integer age;
private boolean married;
public boolean isMarried() {
return married;
}
public void setMarried(boolean married) {
this.married = married;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
然后按正常方法,生成对象,把它转换为JSONObject,接着看注释吧~
public static void main(String[] args) {
Emp emp = new Emp();
emp.setName("Rime");
emp.setAge(23);
emp.setMarried(false);
//转换为JSONObject
JSONObject json = JSONObject.fromObject(emp);
System.out.println(json.toString());
//利用key获取属性值,和map相似
String name = json.getString("name");
Integer age = json.getInt("age");
boolean married = json.getBoolean("married");
System.out.println(name + "," + age + "," + married);
}
输出结果:
{"age":23,"married":false,"name":"Rime"}
Rime,23,false
看到这里你或许会有疑问,(1)假如JSONObject中并没有这个key存在,会怎么样?(2)这个key对应的value的类型错了,怎么办?(3)如果value是复杂数据类型,怎么办?
既然有疑问,那么我们一个一个解决。
(1)我们故意把"name"写错,写成"nane",结果系统报错:
Exception in thread "main" net.sf.json.JSONException: JSONObject["nane"] not found
为了防止这种异常,我们可以用optXXX方法,来代替getXXX方法。
即:
String name = json.optString("nane");//当jsonObject中不存在该key时,可以用optXXX来获取空值或者默认值,而不是报异常
设置默认值:
String name = json.optString("nane","notExits");
设置默认之后,当nane属性不存在时,返回notExits字符串。
(2)我们把程序修改一下
String name = json.getString("age");
boolean married = json.getBoolean("name");
Integer age = json.getInt("name");
运行程序,会报错:
Exception in thread "main" net.sf.json.JSONException: JSONObject["name"] is not a Boolean.
Exception in thread "main" net.sf.json.JSONException: JSONObject["name"] is not a number.这一类错误。
特别要注意的是{"age":23,"married":false,"name":"false"},其中没带""号的false是boolean类型,带引号的是字符串类型。
还有就是大多数类型可以转换为字符串类型,但是反过来就不行了。
(3)复杂数据类型
写一个复杂点的bean
public class Student implements Serializable{
private static final long serialVersionUID = 1L;
private String sname;
private Integer age;
private Date birth;
private List<String> courses;
private Map<String,String> photo;
private Emp emp;
然后,生成对象,给属性赋值
public static void main(String[] args) {
Student s = new Student();
List<String> sList = new LinkedList<String>();
Map<String,String> photos = new HashMap<String,String>();
Emp emp = new Emp();
emp.setName("me");
emp.setAge(10);
emp.setMarried(false);
sList.add("a");
sList.add("b");
photos.put("c", "c");
photos.put("d", "d");
s.setSname("EZ");
s.setAge(23);
s.setBirth(new Date());
s.setCourses(sList);
s.setPhoto(photos);
s.setEmp(emp);
JSONObject jsonObject = JSONObject.fromObject(s);
System.out.println(jsonObject.toString());
//jsonObject转换为javaBean
Student student = (Student) JSONObject.toBean(jsonObject, Student.class);
System.out.println(student.getSname() + ";" + student.getAge() + ";" +student.getBirth() + ";" + student.getCourses().get(1) + ";" + student.getPhoto().get("c") + ";" + student.getEmp());
}
运行结果:
{"age":23,"birth":{"date":7,"day":2,"hours":17,"minutes":24,"month":6,"seconds":33,"time":1436261073641,"timezoneOffset":-480,"year":115},"courses":["a","b"],"emp":{"age":10,"married":false,"name":"me"},"photo":{"d":"d","c":"c"},"sname":"EZ"}
2015-7-7 17:24:33 net.sf.json.JSONObject toBean
信息: Property 'day' of class java.util.Date has no write method. SKIPPED.
2015-7-7 17:24:33 net.sf.json.JSONObject toBean
信息: Property 'timezoneOffset' of class java.util.Date has no write method. SKIPPED.
EZ;23;Tue Jul 07 17:24:33 CST 2015;b;c;com.vmaxtam.json.Emp@43b09468
虽然顺利把数据转换回去了,但是出现了警告信息,总让人无法安心下来。
如果仔细观察,可以发现,以上警告都是有关 java.util.Date 的警告,那么Date类型该如何处理呢?
并且,留意 "birth":{"date":8,"day":3,"hours":11,"minutes":11,"month":6,"seconds":31,"time":1436325091564,"timezoneOffset":-480,"year":115},
你会发现这个格式的数据十分难懂,而且我们一般只要用到yyyy-MM-dd这种格式。
二)Date类型
关于Date类型的转换,我们可以通过转换器来实现。
先写一个转换器:
public class JsonDateValueProcessor implements JsonValueProcessor {
private String datePattern = "yyyy-MM-dd";
public JsonDateValueProcessor() {
super();
}
public JsonDateValueProcessor(String format) {
super();
this.datePattern = format;
}
@Override
public Object processArrayValue(Object value, JsonConfig jsonConfig) {
return process(value);
}
@Override
public Object processObjectValue(String key, Object value,
JsonConfig jsonConfig) {
return process(value);
}
private Object process(Object value) {
try {
if (value instanceof Date) {
SimpleDateFormat sdf = new SimpleDateFormat(datePattern,
Locale.UK);
return sdf.format((Date) value);
}
return value == null ? "" : value.toString();
} catch (Exception e) {
return "";
}
}
public String getDatePattern() {
return datePattern;
}
public void setDatePattern(String pDatePattern) {
datePattern = pDatePattern;
}
}
然后再进行测试:
public static void main(String[] args) {
Student s = new Student();
s.setBirth(new Date());
JsonConfig config = new JsonConfig();
config.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());
JSONObject jsonObject = JSONObject.fromObject(s,config);
System.out.println(jsonObject.toString());
}
最后输出的结果
{"age":0,"birth":"2015-07-08","courses":[],"emp":null,"photo":null,"sname":""}
JSONObject基本内容(三)的更多相关文章
- JSONObject基本内容(二)
参考内容:http://swiftlet.net/archives/category/json 十分感谢!!! 这部分的内容主要是讲述 javaBean转换为JSONObect时,如果有些属性不需要 ...
- JSONObject基本内容(一)
参考资料:http://swiftlet.net/archives/category/json,十分感谢~ 平时做项目,难免有遇到使用json对象的时候,这个东西不难,但是一不使用久了,就会忘记,所以 ...
- OpenXml读取word内容(三)
内容和表格内容一起读: word内容: 代码: public static void ReadWordByOpenXml(string path) { using (WordprocessingDoc ...
- Scrapy爬虫框架补充内容三(代理及其基本原理介绍)
前言:(本文参考维基百科及百度百科所写) 当我们使用爬虫抓取数据时,有时会产生错误比如:突然跳出来了403 Forbidden 或者网页上出现以下提示:您的ip访问频率太高 或者时不时跳出一个验证码需 ...
- java 读取文件内容 三种形式及效率对比
IOUtils.getStringFromReader() 读取方式为最快的 InputStream in = null; String line = ""; long start ...
- Liunx运维(三)-文件过滤及内容编辑处理
文档目录: 一.cat:合并文件或查看文件内容 二.tac:反向显示文件内容 三.more:分页显示文件内容 四.less:分页显示文件内容 五.head:显示文件头部内容 六.tail:显示文件尾部 ...
- JSONObject,JSONArray,Map,String之间转换
http://blog.csdn.net/superit401/article/details/51727739 1.String转JSONObject String jsonMessage = &q ...
- fastjson的JSONArray和JSONObject
转自: http://blog.csdn.net/tangerr/article/details/76217924 Fastjson是国内著名的电子商务互联网公司阿里巴巴内部开发的用于java后台处理 ...
- java和js中JSONObject,JSONArray,Map,String之间转换
--------------------------------------------------Java中--------------------------------------------- ...
随机推荐
- ARMV8 datasheet学习笔记4:AArch64系统级体系结构之Generic timer
1.前言 2.generate timer 2.1 概述 提供了一个系统计数器,用来实时测量流逝的时间: 提供了一个虚拟计数器,用来测量某个虚拟机上流逝的虚拟时间: 定时器,每隔一段时间会触发事件,支 ...
- 深入分析Linux自旋锁【转】
转自:http://blog.chinaunix.net/uid-20543672-id-3252604.html 前言: 在复习休眠的过程中,我想验证自旋锁中不可休眠,所以编写了一个在自旋锁中休眠的 ...
- saltstack自动化运维系列⑥SaltStack实践安装配置HAproxy的Keepalived
saltstack自动化运维系列⑥SaltStack实践安装配置HAproxy的Keepalived 安装配置Keepalived 1.编写功能模块 #创建keepalived目录# mkdir -p ...
- OA系统高性能解决方案(史上最全的通达OA系统优化方案)
序: 这是一篇针对通达OA系统的整体优化方案,文档将硬件.网络.linux操作系统.程序本身(包括web和数据库)以及现有业务有效结合在一起,进行了系统的整合优化.该方案应用于真实生产环境,部署完成后 ...
- Day5-----------------vi编辑器
1.操作模式 1).命令行模式 2).编辑模式 3).扩展模式 2.命令行模式 1).删除与复制 dd 删除光标所在行 ndd 删除光标向下n行 yy 复制光标所在行 nyy 复制光标乡下n行 2). ...
- 根据条件返回相应值 decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)
decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值) [功能]根据条件返回相应值 [参数]c1, c2, ...,cn,字符型/数值型/日期型,必须类型相同或null 注 ...
- charles mock方法及问题
一. 抓包后修改返回数据1.生成一个完成的请求返回信息1.charles抓取一个完整的请求,返回数据2.然后找到该请求,右键“save response”,将该完整请求返回文件保存至本地3.修改本地需 ...
- C 长字符串换行方法
C中字符串有时候会出现很长的情况,如果不换行书写查看起来很不方便. 长字符串拆分成多行处理也是C规范的一部分. 方法1. 利用双引号" " ,将长字符串分成多个子串换行,C会自动无 ...
- TP5.1:request请求对象(使用四种方式获取)
准备: 在index/controller下创建一个名为requests.php的文件(注意:不要起名为request,因为它是关键字,不被允许起名) 动态方法和静态方法的区别: 静态方法:publi ...
- string.intern
在翻<深入理解Java虚拟机>的书时,又看到了2-7的 String.intern()返回引用的测试. 总结一句话: jdk1.7之前,调用intern()方法会判断常量池是否有该字符串, ...