zoukankan      html  css  js  c++  java
  • java与JSON

    XML 格式数据极其的冗长。因为每个离散的数据片段需要大量的 XML 结构,所有有效 的数据的比例非常低。XML 语法还有轻微的模糊。还有,解析 XML 是非常占程序员的精力的。你需要提前了解详细的结构和确切地知道如何解开这个结构,然后细心地将他们写入 js 对象中。JSON 是一种轻量级易与解析的数据格式,它按照 js 的对象和数组的字面量格式来书写。 现在 JSON 的光环已经逐渐超越了 XML,各大网站提供的数据接口一般都是 JSON。

    jquery 1.4 以后对 json 格式变严格了,也就是说必须要这种格式的{"键":"值","键":"值 "};像原来的{键:值,键:值}和{'键':'值','键':'值'}这种都是错误的,不合标准,所以 jquery 返回 error 如"{"success":true,"msg":"success"}",如果说是boolean 类型,则不用加 引号,其它的键/值都需要加引号。

    什么是JSON?

    JSON:JavaScript 对象表示法(JavaScript Object Notation), 一种轻量级的数据交换格式, 易于人阅读和编写, 也易于机器解析和生成。用来描述数据结构,它是基于纯文本的数据格式,是一种轻量级的数据交换格式。广泛应用于服务端与客户端的数据交互。JSON 是存储和交换文本信息的语法,类似 XML。JSON 采用完全独立于语言的文本格式,也使用了类似于 C 语言家族的习惯(包括 C, C++, C#, Java, JavaScript, Perl, Python…)这些特性使 JSON 成为理想的数据交换语言。JSON 是一个新的人类可读( human readable)的数据格式,在过去几年中已变得非常 受欢迎,尤其是在 web 开发中。

    基本类型:

     数组类型:

    对象嵌套:

    Json格式

    1)  两种构建结构
    a) 、对象:“ 名称/ 值” 对的集合(A collection of name/value pairs)不同的语言中,它被理解为对象(object),记录(record),结构(struct),字典 (dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组(associative array)。b) 、数组: 值的有序列表(An ordered list of values)在大多数语言中,它被理解为数组(array)、矢量(vector), 列表(list)或者序列(sequence)。经过对象、数组 2 种结构就可以组合成复杂的数据结构了。

    2)  具体形式
     Json 以 key-value 的形式存储数据
     Key 的取值 为 String 类型;
     Value 的取值 为 String,boolean,Number,数组,Object,null;
     Json 串以{开始,以}结尾;
     Json 串中数组是以[开始,以]结尾;
     Json 串中 Object 是以{开始,以}结尾

    一、 解析方式1. 

    使用 gson  处理

    Gson是一个Google提供的一个Java库,可用于将Java对象转换为JSON表示。它也可以被用来将 JSON 字符串转换成一个等效的 Java 对象。提供易于使用的机制如 toString()和构造函数(工厂方法)将 Java 转换为 JSON,反之亦然。允许自定义表示对象,支持任意复杂的对象,生成紧凑和可读性的JSON 输出

    1)  转为 Json  字符串
    获取所需的对象

    2)解析成java对象

    I) 、Gson  的  节点对象:
    JsonElement : 所有的节点 都是 JsonElement 对象.
    JsonPrimitive : 基本的 数据类型的 节点 对象, JsonElement 的子类.
    JsonNull : 代表 空节点 对象,即 有 key,value 为空,JsonElement 的子类.
    JsonObject : 对象 数据类型的 节点 对象, JsonElement 的 子类.
    JsonArray : 数组 数据类型的 节点 对象, JsonElement 的 子类.
    II) 、JsonElement  的取值:
    JsonPrimitive : value 的 取值对应 java 的
    int,double,float,long,short,boolean,char,byte,String,BigDecimal,BigI nteger,Number
    JsonObject : value 的取值对应 java 的 Object 对象.
    JsonArray : value 的取值对应 java 的 List 及其子类对象.
    III) 、解析对象

    import static org.junit.Assert.*;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import org.junit.Test;
    
    import com.google.gson.Gson;
    import com.google.gson.JsonElement;
    import com.google.gson.JsonObject;
    import com.google.gson.JsonParser;
    import com.google.gson.JsonPrimitive;
    import com.google.gson.reflect.TypeToken;
    import com.test.po.User;
    
    public class GsonTest {
    
        /**
         * @Test注解 单元测试
         * 1、不能有父类
         * 2、不能是静态方法
         * 3、不能有参数
         * 4、返回值是void
         */
        
        @Test
        public void test() {
            fail("Not yet implemented");
        }
        
        /**
         * 将对象转换成JSON字符串
         */
        @Test
        public void testObjectToJson() {
            // 得到对象
            User user = new User(1, "zhangsan", 18, true);
            
            /**
             * String json = {"userId":1,"uname":"zhangsan","age":18,"sex":true};
             */
            // 得到gson对象
            Gson gson = new Gson();
            // 将对象转换成JSON字符串
            String json = gson.toJson(user);
            
            System.out.println(json);
            
             
        }
        
        /**
         * 将JSON字符串转换成对象
         */
        @Test
        public void testJSONToObject(){
            // 定义JSON字符串
            String json = "{"userId":1,"uname":"zhangsan","age":18,"sex":true}";
            // 得到gson对象
            Gson gson = new Gson();
            // 将JSON字符串转换成对象
            User user = gson.fromJson(json, User.class);
            System.out.println(user.getUname());
        }
        
        /**
         * 将集合转换成JSON字符串
         */
        @Test
        public void testListToJson() {
            // 定义集合
            List<String> list = new ArrayList<>();
            list.add("zhangsan");
            list.add("lisi");
            list.add("wangwu");
            // 得到gson对象
            Gson gson = new Gson();
            //  将集合转换成JSON字符串
            String json = gson.toJson(list);
            
            System.out.println(json);
            
            
            List<User> userList = new ArrayList<>();
            User user = new User(1, "zhangsan", 18, true);
            User user2 = new User(2, "lisi", 19, false);
            User user3 = new User(3, "wangwu", 20, true);
            userList.add(user);
            userList.add(user2);
            userList.add(user3);
            //  将集合转换成JSON字符串
            String json2 = gson.toJson(userList);
            System.out.println(json2);
            
        }
        
        /**
         * 将JSON字符串转换成集合
         */
        @Test
        public void testJsonToList() {
            // 定义json对象
            String json = "["zhangsan","lisi","wangwu"]";
            // 得到gson对象
            Gson gson = new Gson();
            // 将JSON字符串转换成集合
            List<String> list = gson.fromJson(json, new TypeToken<List<String>>(){}.getType());
            System.out.println(list.get(0));
        }
        
        /**
         * 将map转换成JSON字符串
         */
        @Test
        public void testMapToJSON() {
            Map<String, Object> map = new HashMap<>();
            map.put("uname", "张三");
            map.put("age", 18);
            map.put("sex", true);
            // 得到gson对象
            Gson gson = new Gson();
            String json = gson.toJson(map);
            
            System.out.println(json);
        }
        
        
        /**
         * 将JSON字符串转换成MAP
         */
        @Test
        public void  testJSONToMap() {
            String json = "{"uname":"张三","sex":true,"age":18}";
            // 得到gson对象
            Gson gson = new Gson();
            Map<String, Object> map = gson.fromJson(json, new TypeToken<Map<String, Object>>(){}.getType());
            System.out.println(map.get("uname"));
        }
        
        /**
         * JSON节点解析
         * 
         */
        @Test
        public void parse() {
            String json = "{"flag": true,"data": {"userId":1,"uname": "张三","age": 18,"sex":true }}";
            // 节点解析
            
            // 得到解析器
            JsonParser parser = new JsonParser();
            
            // 得到根节点
            JsonElement element = parser.parse(json);
            
            // 根据JSON字符串判断当前是什么json数据类型
            JsonObject root = element.getAsJsonObject();
            
            // 解析flag  根据文档判定是boolean类型  基本数据类型
            JsonPrimitive primitive = root.getAsJsonPrimitive("flag");
            // 将基本数据类型转换成具体的数据类型
            boolean flag = primitive.getAsBoolean();
            System.out.println(flag);
            
            // 解析data  根据文档判定是对象类型 JSONObject
            JsonObject data = root.getAsJsonObject("data");
            // 将对象转换为具体的对象
            User user = new Gson().fromJson(data, User.class);
            System.out.println(user.getUname());
            
        }
        
        
    
    }

     

    使用 fastjson  处理

    阿里巴巴 fastJson 是一个 Json 处理工具包,包括“序列化”和“反序列化”两部分,它 具备如下特征:速度最快,测试表明,fastjson 具有极快的性能,超越其他的 Java Json parser。包括自称最快的 JackJson;功能强大,完全支持 JavaBean、集合、Map、日期、Enum,支持范型,支持自省;无依赖。下载路径:https://github.com/alibaba/fastjson/releases/tag/1.2.13   Fastjson 是一个 Java 语言编写的高性能功能完善的 JSON 库。fastjson 采用独创的算法,将 parse 的速度提升到极致,超过所有 json 库,包括曾经号称最快的JackJson。并且还超越了 google 的二进制协议 protocol buf。Fastjson 完全支持 http://json.org 的标准, 也是官方网站收录的参考实现之一。支持各种JDK 类型。包括基本类型、JavaBean、 Collection、Map、Enum、泛型等。支持 JDK 5、JDK 6、Android、阿里云手机等环境。

    import static org.junit.Assert.*;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.junit.Test;
    
    import com.alibaba.fastjson.JSON;
    import com.test.po.User;
    
    public class FastJsonTest {
    
        @Test
        public void test() {
            fail("Not yet implemented");
        }
        
        @Test
        public void testToJson(){
            // 得到对象
            User user = new User(1, "zhangsan", 18, true);
            // 将javaBean转换成JSON字符串
            String json1 = JSON.toJSONString(user);
            System.out.println(json1);
            
            // 定义集合
            List<String> list = new ArrayList<>();
            list.add("zhangsan");
            list.add("lisi");
            list.add("wangwu");
            String json2 = JSON.toJSONString(list);
            System.out.println(json2);
            
            
            List<User> userList = new ArrayList<>();
            User user1 = new User(1, "zhangsan", 18, true);
            User user2 = new User(2, "lisi", 19, false);
            User user3 = new User(3, "wangwu", 20, true);
            userList.add(user1);
            userList.add(user2);
            userList.add(user3);
            String json3 = JSON.toJSONString(userList);
            System.out.println(json3);
        }
        
        @Test
        public void testToObject() {
            // 定义JSON字符串
            String json1= "{"userId":1,"uname":"zhangsan","age":18,"sex":true}";
            User user = JSON.parseObject(json1,User.class);
            System.out.println(user.getUname());
            
            
            // 定义json对象
            String json2 = "["zhangsan","lisi","wangwu"]";
            List<String> list = JSON.parseArray(json2,String.class);
            System.out.println(list.get(2));
            
            
            String json3 = "[{"age":18,"sex":true,"uname":"zhangsan","userId":1},{"age":19,"sex":false,"uname":"lisi","userId":2},{"age":20,"sex":true,"uname":"wangwu","userId":3}]";
            List<User> userList = JSON.parseArray(json3,User.class);
            System.out.println(userList.get(1).getUname());
        
        }
    
    }

    User实体类

    public class User {
        
        private Integer userId;
        private String uname; 
        private Integer age;
        private boolean sex;
        
        
        public User() {
            super();
        }
    
        public User(Integer userId, String uname, Integer age, boolean sex) {
            super();
            this.userId = userId;
            this.uname = uname;
            this.age = age;
            this.sex = sex;
        }
        
        public Integer getUserId() {
            return userId;
        }
        public void setUserId(Integer userId) {
            this.userId = userId;
        }
        public String getUname() {
            return uname;
        }
        public void setUname(String uname) {
            this.uname = uname;
        }
        public Integer getAge() {
            return age;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
        public boolean isSex() {
            return sex;
        }
        public void setSex(boolean sex) {
            this.sex = sex;
        }
            
    }
  • 相关阅读:
    CentOS6 图形界面'Basic server'条件下的(gnome)安装 .
    2013年 2月 春节期间 CgyWin 安装总结
    网络爬虫比较
    如何将nutch项目加载到MyEclipse中,生成一个web project
    读过的书
    NBearLite 用MsAccess数据库时 Count() 的错误(BUG?)
    测试Windows Live Writer
    VS2005 编辑器配色
    事务处理
    MVC MvcApplication 中在.CS文件(CodeBehide)中找不到服务器控件的解决办法
  • 原文地址:https://www.cnblogs.com/liu1459310172/p/9581844.html
Copyright © 2011-2022 走看看