参考资料:http://swiftlet.net/archives/category/json    十分感谢!!!~~

第三篇的内容,主要讲述的有两点: 1 .如何获取JSONObject中对应key的value。   2.如何把JSONObject转换为javaBean对象。

一)获取JSONObject中属性值

首先我们写一个javaBean类

  1. public class Emp {
  2. private String name;
  3. private Integer age;
  4. private boolean married;
  5.  
  6. public boolean isMarried() {
  7. return married;
  8. }
  9. public void setMarried(boolean married) {
  10. this.married = married;
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public Integer getAge() {
  19. return age;
  20. }
  21. public void setAge(Integer age) {
  22. this.age = age;
  23. }
  24. }

然后按正常方法,生成对象,把它转换为JSONObject,接着看注释吧~

  1. public static void main(String[] args) {
  2. Emp emp = new Emp();
  3. emp.setName("Rime");
  4. emp.setAge(23);
  5. emp.setMarried(false);
  6.  
  7. //转换为JSONObject
  8. JSONObject json = JSONObject.fromObject(emp);
  9. System.out.println(json.toString());
  10.  
  11. //利用key获取属性值,和map相似
  12. String name = json.getString("name");
  13. Integer age = json.getInt("age");
  14. boolean married = json.getBoolean("married");
  15.  
  16. System.out.println(name + "," + age + "," + married);
  17. }

输出结果:

{"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方法。

即:

  1.  String name = json.optString("nane");//当jsonObject中不存在该key时,可以用optXXX来获取空值或者默认值,而不是报异常

设置默认值:

  1. String name = json.optString("nane","notExits");

设置默认之后,当nane属性不存在时,返回notExits字符串。

(2)我们把程序修改一下

  1. String name = json.getString("age");
  2. boolean married = json.getBoolean("name");
  3. 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

  1. public class Student implements Serializable{
  2. private static final long serialVersionUID = 1L;
  3. private String sname;
  4. private Integer age;
  5. private Date birth;
  6. private List<String> courses;
  7. private Map<String,String> photo;
  8. private Emp emp;

然后,生成对象,给属性赋值

  1. public static void main(String[] args) {
  2. Student s = new Student();
  3. List<String> sList = new LinkedList<String>();
  4. Map<String,String> photos = new HashMap<String,String>();
  5. Emp emp = new Emp();
  6. emp.setName("me");
  7. emp.setAge(10);
  8. emp.setMarried(false);
  9.  
  10. sList.add("a");
  11. sList.add("b");
  12.  
  13. photos.put("c", "c");
  14. photos.put("d", "d");
  15.  
  16. s.setSname("EZ");
  17. s.setAge(23);
  18. s.setBirth(new Date());
  19. s.setCourses(sList);
  20. s.setPhoto(photos);
  21. s.setEmp(emp);
  22.  
  23. JSONObject jsonObject = JSONObject.fromObject(s);
  24. System.out.println(jsonObject.toString());
  25.  
  26. //jsonObject转换为javaBean
  27. Student student = (Student) JSONObject.toBean(jsonObject, Student.class);
  28. System.out.println(student.getSname() + ";" + student.getAge() + ";" +student.getBirth() + ";" + student.getCourses().get(1) + ";" + student.getPhoto().get("c") + ";" + student.getEmp());
  29. }

运行结果:

{"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类型的转换,我们可以通过转换器来实现。

先写一个转换器:

  1. public class JsonDateValueProcessor implements JsonValueProcessor {
  2. private String datePattern = "yyyy-MM-dd";
  3.  
  4. public JsonDateValueProcessor() {
  5. super();
  6. }
  7.  
  8. public JsonDateValueProcessor(String format) {
  9. super();
  10. this.datePattern = format;
  11. }
  12.  
  13. @Override
  14. public Object processArrayValue(Object value, JsonConfig jsonConfig) {
  15. return process(value);
  16. }
  17.  
  18. @Override
  19. public Object processObjectValue(String key, Object value,
  20. JsonConfig jsonConfig) {
  21. return process(value);
  22. }
  23.  
  24. private Object process(Object value) {
  25. try {
  26. if (value instanceof Date) {
  27. SimpleDateFormat sdf = new SimpleDateFormat(datePattern,
  28. Locale.UK);
  29. return sdf.format((Date) value);
  30. }
  31. return value == null ? "" : value.toString();
  32. } catch (Exception e) {
  33. return "";
  34. }
  35.  
  36. }
  37.  
  38. public String getDatePattern() {
  39. return datePattern;
  40. }
  41.  
  42. public void setDatePattern(String pDatePattern) {
  43. datePattern = pDatePattern;
  44. }
  45. }

然后再进行测试:

  1. public static void main(String[] args) {
  2. Student s = new Student();
  3. s.setBirth(new Date());
  4.  
  5. JsonConfig config = new JsonConfig();
  6. config.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());
  7.  
  8. JSONObject jsonObject = JSONObject.fromObject(s,config);
  9. System.out.println(jsonObject.toString());
  10. }

最后输出的结果

{"age":0,"birth":"2015-07-08","courses":[],"emp":null,"photo":null,"sname":""}

JSONObject基本内容(三)的更多相关文章

  1. JSONObject基本内容(二)

    参考内容:http://swiftlet.net/archives/category/json  十分感谢!!! 这部分的内容主要是讲述 javaBean转换为JSONObect时,如果有些属性不需要 ...

  2. JSONObject基本内容(一)

    参考资料:http://swiftlet.net/archives/category/json,十分感谢~ 平时做项目,难免有遇到使用json对象的时候,这个东西不难,但是一不使用久了,就会忘记,所以 ...

  3. OpenXml读取word内容(三)

    内容和表格内容一起读: word内容: 代码: public static void ReadWordByOpenXml(string path) { using (WordprocessingDoc ...

  4. Scrapy爬虫框架补充内容三(代理及其基本原理介绍)

    前言:(本文参考维基百科及百度百科所写) 当我们使用爬虫抓取数据时,有时会产生错误比如:突然跳出来了403 Forbidden 或者网页上出现以下提示:您的ip访问频率太高 或者时不时跳出一个验证码需 ...

  5. java 读取文件内容 三种形式及效率对比

    IOUtils.getStringFromReader() 读取方式为最快的 InputStream in = null; String line = ""; long start ...

  6. Liunx运维(三)-文件过滤及内容编辑处理

    文档目录: 一.cat:合并文件或查看文件内容 二.tac:反向显示文件内容 三.more:分页显示文件内容 四.less:分页显示文件内容 五.head:显示文件头部内容 六.tail:显示文件尾部 ...

  7. JSONObject,JSONArray,Map,String之间转换

    http://blog.csdn.net/superit401/article/details/51727739 1.String转JSONObject String jsonMessage = &q ...

  8. fastjson的JSONArray和JSONObject

    转自: http://blog.csdn.net/tangerr/article/details/76217924 Fastjson是国内著名的电子商务互联网公司阿里巴巴内部开发的用于java后台处理 ...

  9. java和js中JSONObject,JSONArray,Map,String之间转换

    --------------------------------------------------Java中--------------------------------------------- ...

随机推荐

  1. Attempting to badge the application icon but haven't received permission from the user to badge the application错误解决办法

    今天刚刚学习UIApplication对象,当我希望利用这个对象在我们的应用图标上显示个数字的时候,xcode报了这个错误:  解决办法 : - (IBAction)applicationClicke ...

  2. 使用SSH远程登陆Linux

    ⒈SSH介绍 SSH(Secure Shell)由IETF的网络工作小组(NetWork Working Group)所制定,SSH是建立在应用层和传输层基础上的安全协议. SSH是目前较可靠,专为远 ...

  3. 【漏洞分析】两个例子-数组溢出修改返回函数与strcpy覆盖周边内存地址

    修改返回函数 return 0 下面的程序的运行流程为main()函数调用了Magic()函数,通常执行完Magic()函数后会调用return 0 的地址, 但是在执行Magic()函数中时,数组下 ...

  4. Python3学习笔记18-访问限制

    在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑. 但是,从Student类的定义来看,外部代码还是可以自由地修改一个实例的name ...

  5. jython获取was5.1的jvm监控参数

    perfName = AdminControl.completeObjectName ('type=Perf,process=server1,node=TSC,cell=TSC,*') perfONa ...

  6. ASP.NET Core Identity 实战(3)认证过程

    如果你没接触过旧版Asp.Net Mvc中的 Authorize 或者 Cookie登陆,那么你一定会疑惑 认证这个名词,这太正式了,这到底代表这什么? 获取资源之前得先过两道关卡Authentica ...

  7. client模式下对应接口加入桥接出错

    client模式下,响应的接口wlan0 加入桥接时出现如下错误: root@root:~# brctl addif br-lan wlan0brctl: bridge br-lan: Operati ...

  8. Android软件更新

    Android软件更新 //得到当前版本编码和版本名称. public static int getVerCode(Context context) { ; try { verCode =).vers ...

  9. .netcore 整合 log4net

    1.背景 前两天,曾经的一个同事咨询我,怎样将log4net以中间件的形式整合到core里边去.我不假思索的回答,这种问题应该有人做过吧,他说没有.于是,我去博客园搜了下,发现还真没有,全部都是传统. ...

  10. Python-HTML CSS 练习

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...