zoukankan      html  css  js  c++  java
  • JSON和fastjson

    一、JSON

    语法规则:

    • 数据在名称/值对中
    • 数据由逗号分隔
    • 花括号保存对象
    • 方括号保存数组

    名称/值对-->对象-->数组

     

    JSON 名称/值对

    JSON 数据的书写格式是:名称/值对。

    名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:

    "firstName" : "John"

    JSON 值可以是:

    • 数字(整数或浮点数)
    • 字符串(在双引号中)
    • 逻辑值(true 或 false)
    • 数组(在方括号中)
    • 对象(在花括号中)
    • null


    JSON 对象

    JSON 对象在花括号中书写:

    对象可以包含多个名称/值对:

    { "firstName":"John" , "lastName":"Doe" }

    JSON 数组

    JSON 数组在方括号中书写:

    数组可包含多个对象:

    {
    "employees": [
    { "firstName":"John" , "lastName":"Doe" },
    { "firstName":"Anna" , "lastName":"Smith" },
    { "firstName":"Peter" , "lastName":"Jones" }
    ]
    }

    在上面的例子中,对象 "employees" 是包含三个对象的数组。每个对象代表一条关于某人(有姓和名)的记录。

    二、fastjson

    Fastjson是一个Java语言编写的高性能功能完善的JSON库。

      <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>fastjson</artifactId>
           <version>1.2.51</version>
       </dependency>

    序列化API

    package com.alibaba.fastjson;
    
    public abstract class JSON {
        // 将Java对象序列化为JSON字符串,支持各种各种Java基本类型和JavaBean
        public static String toJSONString(Object object, SerializerFeature... features);
    
        // 将Java对象序列化为JSON字符串,返回JSON字符串的utf-8 bytes
        public static byte[] toJSONBytes(Object object, SerializerFeature... features);
    
        // 将Java对象序列化为JSON字符串,写入到Writer中
        public static void writeJSONString(Writer writer, 
                                           Object object, 
                                           SerializerFeature... features);
    
        // 将Java对象序列化为JSON字符串,按UTF-8编码写入到OutputStream中
        public static final int writeJSONString(OutputStream os, // 
                                                Object object, // 
                                                SerializerFeature... features);
    
    }

    JSON字符串反序列化API

    package com.alibaba.fastjson;
    
    public abstract class JSON {
        // 将JSON字符串反序列化为JavaBean
        public static <T> T parseObject(String jsonStr, 
                                        Class<T> clazz, 
                                        Feature... features);
    
        // 将JSON字符串反序列化为JavaBean
        public static <T> T parseObject(byte[] jsonBytes,  // UTF-8格式的JSON字符串
                                        Class<T> clazz, 
                                        Feature... features);
    
        // 将JSON字符串反序列化为泛型类型的JavaBean
        public static <T> T parseObject(String text, 
                                        TypeReference<T> type, 
                                        Feature... features);
    
        // 将JSON字符串反序列为JSONObject
        public static JSONObject parseObject(String text);
    }

    Demo

    parse Tree

    import com.alibaba.fastjson.*;
    
    JSONObject jsonObj = JSON.parseObject(jsonStr);

    parse POJO

    import com.alibaba.fastjson.JSON;
    
    Model model = JSON.parseObject(jsonStr, Model.class);

    parse POJO Generic

    import com.alibaba.fastjson.JSON;
    
    Type type = new TypeReference<List<Model>>() {}.getType(); 
    List<Model> list = JSON.parseObject(jsonStr, type);

    convert POJO to json string

    import com.alibaba.fastjson.JSON;
    
    Model model = ...; 
    String jsonStr = JSON.toJSONString(model);

    convert POJO to json bytes

    import com.alibaba.fastjson.JSON;
    
    Model model = ...; 
    byte[] jsonBytes = JSON.toJSONBytes(model);

    write POJO as json string to OutputStream

    import com.alibaba.fastjson.JSON;
    
    Model model = ...; 
    OutputStream os;
    JSON.writeJSONString(os, model);

    write POJO as json string to Writer

    import com.alibaba.fastjson.JSON;
    
    Model model = ...; 
    Writer writer = ...;
    JSON.writeJSONString(writer, model);

    JsonObject用法

    1.put(String key, Object value)方法,在JSONObject对象中设置键值对在,在进行设值得时候,key是唯一的,如果用相同的key不断设值得时候,保留后面的值。

    2.Object get(String key) :根据key值获取JSONObject对象中对应的value值,获取到的值是Object类型,需要手动转化为需要的数据类型

    3.int size():获取JSONObject对象中键值对的数量

    4.boolean isEmpty():判断该JSONObject对象是否为空

    5.containsKey(Object key):判断是否有需要的key值

    6.boolean containsValue(Object value):判断是否有需要的value值

    7.JSONObject getJSONObject(String key):如果JSONObjct对象中的value是一个JSONObject对象,即根据key获取对应的JSONObject对象;

    8.JSONArray getJSONArray(String key) :如果JSONObject对象中的value是一个JSONObject数组,既根据key获取对应的JSONObject数组;

    9.Object remove(Object key):根据key清除某一个键值对。

    由于JSONObject是一个map,它还具有map特有的两个方法

    10.Set<String> keySet() :获取JSONObject中的key,并将其放入Set集合中

    11.Set<Map.Entry<String, Object>> entrySet():在循环遍历时使用,取得是键和值的映射关系,Entry就是Map接口中的内部接口

    与String字符串转换:

    12.toJSONString() /toString():将JSONObject对象转换为json的字符串

    public static void main(String[] args) {
            //新建JSONObject对象
            JSONObject object1 = new JSONObject();
            
            //1.在JSONObject对象中放入键值对
            object1.put("name", "张三");
            object1.put("name1", "张三1");
            object1.put("name2", "张三2");
            
            //2.根据key获取value
            String name = (String) object1.get("name");
            System.out.println(name);
            
            //3.获取JSONObject中的键值对个数
            int size = object1.size();
            System.out.println(size);
            
            //4.判断是否为空
            boolean result = object1.isEmpty();
            System.out.println(result);
            
            //5.是否包含对应的key值,包含返回true,不包含返回false
            boolean isContainsKeyResult = object1.containsKey("name");
            System.out.println(isContainsKeyResult);
            
            //6.是否包含对应的value值,包含返回true,不包含返回false
            boolean isContainsValueResult = object1.containsValue("王五");
            System.out.println(isContainsValueResult);
            
            //7.JSONObjct对象中的value是一个JSONObject对象,即根据key获取对应的JSONObject对象;
            JSONObject object2 = new JSONObject();
            //将jsonobject对象作为value进行设置
            object2.put("student1", object1);
            JSONObject student =object2.getJSONObject("student1");
            System.out.println(student);
            
            //8.如果JSONObject对象中的value是一个JSONObject数组,既根据key获取对应的JSONObject数组;
            JSONObject objectArray = new JSONObject();
            //创建JSONArray数组
            JSONArray jsonArray = new JSONArray();
            //在JSONArray数组设值:jsonArray.add(int index, Object value);
            jsonArray.add(0, "this is a jsonArray value");
            jsonArray.add(1, "another jsonArray value");
            objectArray.put("testArray", jsonArray);
            //获取JSONObject对象中的JSONArray数组
            JSONArray jsonArray2 = objectArray.getJSONArray("testArray");
            System.out.println(jsonArray2);
            
            //9.remove.根据key移除JSONObject对象中的某个键值对
            object1.remove("name");
            System.out.println(object1);
            
            //10.取得JSONObject对象中key的集合
            Set<String> keySet= object1.keySet();
            for (String key : keySet) {
                System.out.print("   "+key);
            }
            System.out.println();
            
            //11.取得JSONObject对象中的键和值的映射关系
            Set<Map.Entry<String, Object>> entrySet = object1.entrySet();
            for (Entry<String, Object> entry : entrySet) {
                System.out.println(entry);
            }
            
            //12.转换为json字符串
            String str1 = object1.toJSONString();
            System.out.println(str1);
            String str2 =object1.toString();
            System.out.println(str2);
        }


    Json的序列化和反序列化
    Json操作


  • 相关阅读:
    HDU 5492 Find a path
    codeforce gym 100548H The Problem to Make You Happy
    Topcoder SRM 144 Lottery
    codeforce 165E Compatible Numbers
    codeforce gym 100307H Hack Protection
    区间DP总结
    UESTC 1321 柱爷的恋爱 (区间DP)
    HDU 4283 You Are the One (区间DP)
    HDU 2476 String painter (区间DP)
    UESTC 426 Food Delivery (区间DP)
  • 原文地址:https://www.cnblogs.com/aidata/p/11603349.html
Copyright © 2011-2022 走看看