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;[email protected]

虽然顺利把数据转换回去了,但是出现了警告信息,总让人无法安心下来。

如果仔细观察,可以发现,以上警告都是有关 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":""}

时间: 2024-08-29 10:06:31

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

JSONObject基本内容(二)

参考内容:http://swiftlet.net/archives/category/json  十分感谢!!! 这部分的内容主要是讲述 javaBean转换为JSONObect时,如果有些属性不需要转换,那么该如何操作. 过滤属性在什么时候会用到呢? 有时候我们会把对象以json格式传送,如果一个对象携带着一些私人信息,那么我们就要先把这些信息过滤掉,再进行传输了. 一)方法一:实现JSONString接口,实现toJSONString方法 那么我们现在写一个Person类,实现这个JSONS

JSONObject基本内容(一)

参考资料:http://swiftlet.net/archives/category/json,十分感谢~ 平时做项目,难免有遇到使用json对象的时候,这个东西不难,但是一不使用久了,就会忘记,所以把它的基本用法写一下. 前提: 导入相关的jar文件: commons-lang-1.0.4.jar commons-collections-2.1.jar commons-beanutils-1.8.0.jar json-lib-2.4.jar ezmorph-1.0.6.jar commons-

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

前言:(本文参考维基百科及百度百科所写) 当我们使用爬虫抓取数据时,有时会产生错误比如:突然跳出来了403 Forbidden 或者网页上出现以下提示:您的ip访问频率太高 或者时不时跳出一个验证码需要你输入,这是由于网站采取了反爬虫措施:服务器会检查某个固定的ip在单位时间内请求的次数,如果发现请求过于频繁就会封掉你的ip,就像你一直找人办事,突然有一天帮你办事的人不乐意了,就对你说滚!(即我们的ip被封了!),这里我们引入一个全新的概念:代理 1.What is 代理? 答:代理也叫代理服务

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

IOUtils.getStringFromReader() 读取方式为最快的 InputStream in = null; String line = ""; long start=0,end=0; try { start = System.currentTimeMillis(); in = new FileInputStream(new File("D://1.txt")); InputStreamReader stream = new InputStreamRe

CSS的三种定位方式介绍(转载)

在CSS中一共有N种定位方式,其中,static ,relative,absolute三种方式是最基本最常用的三种定位方式.他们的基 本介绍如下. static默认定位方式relative相对定位,相对于原来的位置,但是原来的位置仍然保留absolute定位,相对于最近的非标准刘定位,原来的位置消失,被后边的位置所顶替 下面先演示相对定位的案例 [html] view plain copyprint? <!DOCTYPE html> <html> <head> <

ajax中网页传输(三)XML——下拉列表显示练习

XML:页面之间传递数据,跨平台传递 HTML:超文本标记语言,核心标签 XML的形势为 <xml version='1.0'> <Nation> <one> <code>n001</code> <name>汉族</name> </one> <two> <code>n002</code> <name>苗族</name> </two> <

实现选项卡切换的三种方式

首先我用Jquery库实现了一个简单的效果, 只需要点击上面的导航标签即可切换下方内容,Html代码如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>tab切换</title> <style type="text/css"> *{padding:0;margin:0;f

2017年内容营销如何提高ROI转化率

根据2017 CMI报告显示,有近41%的营销人员今年会实施一系列内容营销战略.作为与用户间长期关系的桥梁, 从品牌化输出到信任感的培育,内容营销的影响力迅猛发展. 本次Focussend从互动集成内容.可视化内容以及沉浸式内容三个方面详解2017内容营销趋势,助力搭建与用户亲密互动的枢纽. ①  多元可视化内容,挑起优化用户交互体验“大梁” 碎片化信息时代,人脑捕捉及过滤信息的加速度也急速上升,信息文字图层逐渐被可视化内容所取代.图表.动图.表情.符号.视频等在内容营销中备受青睐. 如邮件营销

Lucene.Net 2.3.1开发介绍 —— 三、索引(四)

原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(四) 4.索引对搜索排序的影响 搜索的时候,同一个搜索关键字和同一份索引,决定了一个结果,不但决定了结果的集合,也确定了结果的顺序.那个这个结果是怎么得出来的?这个顺序又是怎么排的呢?这两个问题不是本节讨论的重点,但是这两个问题却关系到本节要讨论的,索引对结果的影响问题.在不使用字段排序的情况下,Lucene.Net默认是按文档的得分来排序的,这个公式看着很复杂,感觉像是大学时高数书上的那些个公式,其实说清楚了也简单. 关于文档排序