zoukankan      html  css  js  c++  java
  • 浅谈JSON

    一、什么是JSON?

      JSON------JavaScript Object Notation(JavaScript 对象表示法)
      JSON是存储和交换文本信息的语法。独立于编程语言之外存在。
      JSON比XML更小、更快、更易解析。
      JSON具有自我描述性,更易理解。

    二、与JavaScript对象
            JSON文本格式在语法上与创建JavaScript对象的代码相同
            由于这种相似性,无需解析器,JavaScript程序能够使用内建eval()函数,用JSON数据来生成原生的JavaScript对象。
    三、与XML比较
            相同点:
                JSON是纯文本
                JSON具有自我描述性
                JSON具有层级结构
                JSON可通过JavaScript进行解析
                JSON数据可使用AJAX进行传输
             不同点:
                没有结束标签
                更短
                读写速度更快
                能够使用内建的JavaScript eavl()方法进行解析
                使用数组
                不使用保留字
    四、为什么使用JSON?
            对于AJAX应用程序来说,JSON比XML更快更易于使用。
    使用XML
            读取XML文档
            使用XML DOM来循环遍历文档
            读取值并存储在变量中
    使用JSON
            读取JSON字符串
            用eval()处理JSON字符串
    五、语法规则
            数据在名称/值对中
            数据由逗号分隔
            大括号保存对象
            中括号保存数组
    六、JSON的数据格式
      6.1   JSON对象
    {  "starcraft": {   "INC": "Blizzard",  "price": 60  }  }
      6.2  JSON对象的访问
          使用点号(.)来访问对象的值。
    var myObj, x;
    myObj = { "name":"runoob", "alexa":10000, "site":null };
    x = myObj.name;

      也可使用中括号([])来访问对象

    var myObj, x;
    myObj = { "name":"runoob", "alexa":10000, "site":null };
    x = myObj["name"];

      6.3 JSON数组

    {  "person": [  "BOB", 60,1882338409,"北京市西直门外大街88号"   ]  } 
    {"s":[{"date":"dateValue","space":"spaceValue"}],"s1":[{"data1":"data1Value","value1":"v1","value2":"v2"}]}   //项目中用到的格式

      6.4 JSON数组的访问

    myObj = {
        "name":"网站",
        "num":3,
        "sites":[ "Google", "Runoob", "Taobao" ]
    }
    x = myObj.sites[0];
    七、JSON.parse()
    JSON通常用于与服务端交换数据。
    在接收服务器数据时一般是字符串。
    我们可以使用JSON.parse()方法将数据转换为JavaScript对象。
    JSON.parse(text[, reviver])
    text:必须是一个有效的JSON字符串
    reviver:可选,一个转换结果的函数,将为对象的每个成员调用此函数。
    示例
    <p id="demo"></p>
    <script>
    var obj = JSON.parse('{ "name":"runoob", "alexa":10000, "site":"www.runoob.com" }');
    document.getElementById("demo").innerHTML = obj.name + ":" + obj.site;
    </script>
    八、java后台封装为JSON数据格式
    8.1使用ObjectMapper---------做过的项目中用到的方法
    ObjectMapper类是Jackson库的主要类。它提供一些功能将转换成Java对象匹配JSON结构,反之亦然。它使用JsonParser和JsonGenerator的实例实现JSON实际的读/写。
    Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。Jackson所依赖的jar包较少,简单易用并且性能也要相对高些,并且Jackson社区相对比较活跃,更新速度也比较快。
        public static void   main(String[] args) {    
            ObjectMapper mapper =new ObjectMapper();  
            Map<String, String> map = new HashMap<String,String>();    
            map.put("city", "beijing");
            map.put("Area", "10000");
            map.put("number", "1000");
            try {
                System.out.println(mapper.writeValueAsString(map));
            } catch (JsonProcessingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
        }

    8.2工具类

    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import net.sf.json.JSONArray;
    import net.sf.json.JSONObject;
    import org.apache.commons.beanutils.BeanUtils;
    
    public class JSONUtils
    {
        /**
         * 
         * @author wangwei JSON工具类
         * @param 
         * 
         */
        
        /***
         * 将List对象序列化为JSON文本
         */
        public static <T> String toJSONString(List<T> list)
        {
            JSONArray jsonArray = JSONArray.fromObject(list);
    
            return jsonArray.toString();
        }
        
        /***
         * 将对象序列化为JSON文本
         * @param object
         * @return
         */
        public static String toJSONString(Object object)
        {
            JSONArray jsonArray = JSONArray.fromObject(object);
    
            return jsonArray.toString();
        }
    
        /***
         * 将JSON对象数组序列化为JSON文本
         * @param jsonArray
         * @return
         */
        public static String toJSONString(JSONArray jsonArray)
        {
            return jsonArray.toString();
        }
    
        /***
         * 将JSON对象序列化为JSON文本
         * @param jsonObject
         * @return
         */
        public static String toJSONString(JSONObject jsonObject)
        {
            return jsonObject.toString();
        } 
        
        /***
         * 将对象转换为List对象
         * @param object
         * @return
         */
        public static List toArrayList(Object object)
        {
            List arrayList = new ArrayList();
    
            JSONArray jsonArray = JSONArray.fromObject(object);
    
            Iterator it = jsonArray.iterator();
            while (it.hasNext())
            {
                JSONObject jsonObject = (JSONObject) it.next();
    
                Iterator keys = jsonObject.keys();
                while (keys.hasNext())
                {
                    Object key = keys.next();
                    Object value = jsonObject.get(key);
                    arrayList.add(value);
                }
            }
    
            return arrayList;
        }
    
        /***
         * 将对象转换为Collection对象
         * @param object
         * @return
         */
        public static Collection toCollection(Object object)
        {
            JSONArray jsonArray = JSONArray.fromObject(object);
    
            return JSONArray.toCollection(jsonArray);
        }
    
        /***
         * 将对象转换为JSON对象数组
         * @param object
         * @return
         */
        public static JSONArray toJSONArray(Object object)
        {
            return JSONArray.fromObject(object);
        }
    
        /***
         * 将对象转换为JSON对象
         * @param object
         * @return
         */
        public static JSONObject toJSONObject(Object object)
        {
            return JSONObject.fromObject(object);
        }
    
        /***
         * 将对象转换为HashMap
         * @param object
         * @return
         */
        public static HashMap toHashMap(Object object)
        {
            HashMap<String, Object> data = new HashMap<String, Object>();
            JSONObject jsonObject = JSONUtils.toJSONObject(object);
            Iterator it = jsonObject.keys();
            while (it.hasNext())
            {
                String key = String.valueOf(it.next());
                Object value = jsonObject.get(key);
                data.put(key, value);
            }
    
            return data;
        }
    
        /***
         * 将对象转换为List>
         * @param object
         * @return
         */
        // 返回非实体类型(Map)的List
        public static List<Map<String, Object>> toList(Object object)
        {
            List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
            JSONArray jsonArray = JSONArray.fromObject(object);
            for (Object obj : jsonArray)
            {
                JSONObject jsonObject = (JSONObject) obj;
                Map<String, Object> map = new HashMap<String, Object>();
                Iterator it = jsonObject.keys();
                while (it.hasNext())
                {
                    String key = (String) it.next();
                    Object value = jsonObject.get(key);
                    map.put((String) key, value);
                }
                list.add(map);
            }
            return list;
        }
    
        /***
         * 将JSON对象数组转换为传入类型的List
         * @param 
         * @param jsonArray
         * @param objectClass
         * @return
         */
        public static <T> List<T> toList(JSONArray jsonArray, Class<T> objectClass)
        {
            return JSONArray.toList(jsonArray, objectClass);
        }
    
        /***
         * 将对象转换为传入类型的List
         * @param 
         * @param jsonArray
         * @param objectClass
         * @return
         */
        public static <T> List<T> toList(Object object, Class<T> objectClass)
        {
            JSONArray jsonArray = JSONArray.fromObject(object);
    
            return JSONArray.toList(jsonArray, objectClass);
        }
    
        /***
         * 将JSON对象转换为传入类型的对象
         * @param 
         * @param jsonObject
         * @param beanClass
         * @return
         */
        public static <T> T toBean(JSONObject jsonObject, Class<T> beanClass)
        {
            return (T) JSONObject.toBean(jsonObject, beanClass);
        }
    
        /***
         * 将将对象转换为传入类型的对象
         * @param 
         * @param object
         * @param beanClass
         * @return
         */
        public static <T> T toBean(Object object, Class<T> beanClass)
        {
            JSONObject jsonObject = JSONObject.fromObject(object);
    
            return (T) JSONObject.toBean(jsonObject, beanClass);
        }
    
        /***
         * 将JSON文本反序列化为主从关系的实体
         * @param 泛型T 代表主实体类型
         * @param 泛型D 代表从实体类型
         * @param jsonString JSON文本
         * @param mainClass 主实体类型
         * @param detailName 从实体类在主实体类中的属性名称
         * @param detailClass 从实体类型
         * @return
         */
        public static <T, D> T toBean(String jsonString, Class<T> mainClass,
                String detailName, Class<D> detailClass)
        {
            JSONObject jsonObject = JSONObject.fromObject(jsonString);
            JSONArray jsonArray = (JSONArray) jsonObject.get(detailName);
    
            T mainEntity = JSONUtils.toBean(jsonObject, mainClass);
            List<D> detailList = JSONUtils.toList(jsonArray, detailClass);
    
            try
            {
                BeanUtils.setProperty(mainEntity, detailName, detailList);
            }
            catch (Exception ex)
            {
                throw new RuntimeException("主从关系JSON反序列化实体失败!");
            }
    
            return mainEntity;
        }
    
        /***
         * 将JSON文本反序列化为主从关系的实体
         * @param 泛型T 代表主实体类型
         * @param 泛型D1 代表从实体类型
         * @param 泛型D2 代表从实体类型
         * @param jsonString JSON文本
         * @param mainClass 主实体类型
         * @param detailName1 从实体类在主实体类中的属性
         * @param detailClass1 从实体类型
         * @param detailName2 从实体类在主实体类中的属性
         * @param detailClass2 从实体类型
         * @return
         */
        public static <T, D1, D2> T toBean(String jsonString, Class<T> mainClass,
                String detailName1, Class<D1> detailClass1, String detailName2,
                Class<D2> detailClass2)
        {
            JSONObject jsonObject = JSONObject.fromObject(jsonString);
            JSONArray jsonArray1 = (JSONArray) jsonObject.get(detailName1);
            JSONArray jsonArray2 = (JSONArray) jsonObject.get(detailName2);
    
            T mainEntity = JSONUtils.toBean(jsonObject, mainClass);
            List<D1> detailList1 = JSONUtils.toList(jsonArray1, detailClass1);
            List<D2> detailList2 = JSONUtils.toList(jsonArray2, detailClass2);
    
            try
            {
                BeanUtils.setProperty(mainEntity, detailName1, detailList1);
                BeanUtils.setProperty(mainEntity, detailName2, detailList2);
            }
            catch (Exception ex)
            {
                throw new RuntimeException("主从关系JSON反序列化实体失败!");
            }
    
            return mainEntity;
        }
        
        /***
         * 将JSON文本反序列化为主从关系的实体
         * @param 泛型T 代表主实体类型
         * @param 泛型D1 代表从实体类型
         * @param 泛型D2 代表从实体类型
         * @param jsonString JSON文本
         * @param mainClass 主实体类型
         * @param detailName1 从实体类在主实体类中的属性
         * @param detailClass1 从实体类型
         * @param detailName2 从实体类在主实体类中的属性
         * @param detailClass2 从实体类型
         * @param detailName3 从实体类在主实体类中的属性
         * @param detailClass3 从实体类型
         * @return
         */
        public static <T, D1, D2, D3> T toBean(String jsonString,
                Class<T> mainClass, String detailName1, Class<D1> detailClass1,
                String detailName2, Class<D2> detailClass2, String detailName3,
                Class<D3> detailClass3)
        {
            JSONObject jsonObject = JSONObject.fromObject(jsonString);
            JSONArray jsonArray1 = (JSONArray) jsonObject.get(detailName1);
            JSONArray jsonArray2 = (JSONArray) jsonObject.get(detailName2);
            JSONArray jsonArray3 = (JSONArray) jsonObject.get(detailName3);
    
            T mainEntity = JSONUtils.toBean(jsonObject, mainClass);
            List<D1> detailList1 = JSONUtils.toList(jsonArray1, detailClass1);
            List<D2> detailList2 = JSONUtils.toList(jsonArray2, detailClass2);
            List<D3> detailList3 = JSONUtils.toList(jsonArray3, detailClass3);
    
            try
            {
                BeanUtils.setProperty(mainEntity, detailName1, detailList1);
                BeanUtils.setProperty(mainEntity, detailName2, detailList2);
                BeanUtils.setProperty(mainEntity, detailName3, detailList3);
            }
            catch (Exception ex)
            {
                throw new RuntimeException("主从关系JSON反序列化实体失败!");
            }
    
            return mainEntity;
        }
    
        /***
         * 将JSON文本反序列化为主从关系的实体
         * @param 主实体类型
         * @param jsonString JSON文本
         * @param mainClass 主实体类型
         * @param detailClass 存放了多个从实体在主实体中属性名称和类型
         * @return
         */
        public static <T> T toBean(String jsonString, Class<T> mainClass,
                HashMap<String, Class> detailClass)
        {
            JSONObject jsonObject = JSONObject.fromObject(jsonString);
            T mainEntity = JSONUtils.toBean(jsonObject, mainClass);
            for (Object key : detailClass.keySet())
            {
                try
                {
                    Class value = (Class) detailClass.get(key);
                    BeanUtils.setProperty(mainEntity, key.toString(), value);
                }
                catch (Exception ex)
                {
                    throw new RuntimeException("主从关系JSON反序列化实体失败!");
                }
            }
            return mainEntity;
        }
    }

    本文来自博客园,作者:编程狸,转载请注明原文链接:https://www.cnblogs.com/ping-pong/p/8631099.html

  • 相关阅读:
    WCF 第八章 安全 确定替代身份(中)使用AzMan认证
    WCF 第八章 安全 总结
    WCF 第八章 安全 因特网上的安全服务(下) 其他认证模式
    WCF Membership Provider
    WCF 第八章 安全 确定替代身份(下)模仿用户
    WCF 第八章 安全 因特网上的安全服务(上)
    WCF 第九章 诊断
    HTTPS的七个误解(转载)
    WCF 第八章 安全 日志和审计
    基于比较的排序算法集
  • 原文地址:https://www.cnblogs.com/ping-pong/p/8631099.html
Copyright © 2011-2022 走看看