• JSON 解析 (一)—— FastJSON的使用


    FastJSON是一个高性能、功能完善的json序列化和解析工具库,可使用Maven添加依赖

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

    一、序列化

    FastJSON提供了多个序列化的方法

     1、基本的序列化

    String json = JSON.toJSONString(Object object);

    2、字符串格式化

    String json = JSON.toJSONString(Object object, boolean prettyFormat);    // 当prettyFormat为true
    String json = JSON.toJSONString(Object object, SerializerFeature... features)     // 当SerializerFeature为PrettyFormat

    3、日期格式化

    String json = JSON.toJSONString(new Date());    // 1521685830801
    String json = JSON.toJSONString(new Date(), SerializerFeature.WriteDateUseDateFormat);    // "2018-03-22 10:30:30"
    String json = JSON.toJSONStringWithDateFormat(new Date(), "yyyy-MM-dd");    // "2018-03-22"

    4、输出null字段

      默认情况下,FastJSON不输出值为null的字段,可以使用SerializerFeature.WriteMapNullValue使其输出

    String json = JSON.toJSONString(Object object, SerializerFeature... features)     // 当SerializerFeature为WriteMapNullValue

    5、数字的格式化

    Map<String, Object> map = new HashMap<String, Object>();
    map.put("key1", 3.3696587);
    map.put("key2", "abc");
    
    SerializeConfig serializeConfig = SerializeConfig.getGlobalInstance();
    serializeConfig.put(Double.class, new DoubleSerializer("#.##"));
    System.out.println(JSON.toJSONString(map));
    // {"key2":"abc","key1":3.37}

    6、自定义指定类型的格式化

    SerializeConfig serializeConfig = new SerializeConfig();
    serializeConfig.put(Double.class, new ObjectSerializer() {
        @Override
        public void write(JSONSerializer serializer, Object object, Object fieldName, 
         Type fieldType, int features) throws IOException { serializer.out.write(String.format("%.2f", (Double)object));
      }
    });
    System.out.println(JSON.toJSONString(map, serializeConfig)); // {"key2":"abc","key1":3.37}

     详细可参考ObjectSerializer代码中的官方注释

     7、自定义字段输出

    保留最外层实体中为null的字段,其他字段忽略

    Map<String, Object> map = new HashMap<>();
    Map<String, Object> subMap = new HashMap<>();
    map.put("hello", "world");
    map.put("age", null);
    subMap.put("aa", "123");
    subMap.put("bb", null);
    map.put("sub", subMap);
    
    System.out.println(JSON.toJSONString(map, new PropertyFilter() {
        @Override
        public boolean apply(Object object, String name, Object value) {
            if (object == map || value != null) {
                return true;
            }
            else {
                return false;
            }
        }
    }, SerializerFeature.WriteMapNullValue));  // {"sub":{"aa":"123"},"hello":"world","age":null}

    详细可参考[转]FastJSON通过SerializeFilter定制序列化

    二、反序列化

    1、简单的反序列化

    UserInfo userInfo = JSON.parseObject(json, UserInfo.class);  // 实体可包含泛型字段

    2、集合的反序列化

    List<UserInfo> tmplist = JSON.parseArray(json, UserInfo.class);

    3、泛型的反序列化

    List<UserInfo> tmplist = (List<UserInfo>) JSON.parseObject(json, new TypeReference<List<UserInfo>>(){});

    4、JSONObject

     JSONObject实现了Map<String, Object>接口,并定义了多个获取指定类型值的方法,当不指定类型时,FastSON默认将对象的解析为JSONObject

    JSONObject jsonObject = JSON.parseObject(json); // {"age":21,"name":"matt"}
    System.out.println(jsonObject.getString("name"));
    System.out.println(jsonObject.getInteger("age"));

     json字段转换为Object对象,每种json类型均转为特定类型

    String json = "[3, 3.0,"abc"]";
    JSONArray jsonArray = JSON.parseArray(json);
    for (Object obj : jsonArray) {
        System.out.println(obj.getClass().getSimpleName());
    }
    // 输出为:Integer    BigDecimal    String

    5、JSONArray

     JSONArray实现了List<Object>接口,遍历时的对象为Object类型,使用时须强转为JSONObject类型

    JSONArray jsonArray = JSON.parseArray(json);    // [{"age":21,"name":"matt"},{"age":15,"name":"kevin"}]
    for (Object obj : jsonArray) {
        JSONObject jsonObject = (JSONObject) obj;
        System.out.println(jsonObject.getString("name"));
    }

     6、方法参数的反序列化

     对于方法的参数可能为泛型的情况,可使用parseObject(String json, Type type, Feature... features)实现反序列化

    public class Company {
        public void printUsers(List<UserInfo> users) {
            for (UserInfo userInfo : users) {
                System.out.println(String.format("name:%s, age:%d", userInfo.getName(), userInfo.getAge()));
            }
        } 
    }
    String json = "[{"name":"matt","age":21},{"name":"kevin","age":15}]";
    Method method = Company.class.getDeclaredMethods()[0];
    Type type = method.getGenericParameterTypes()[0];
    method.invoke(new Company(), JSON.parseObject(json, type));
    // 输出:
    // name:matt, age:21
    // name:kevin, age:15

    参考:

    FastJSON 简单使用

    fastjson浮点类型显示科学计数法的问题

    FastJson对于JSON格式字符串、JSON对象及JavaBean之间的相互转换

    [转]FastJSON通过SerializeFilter定制序列化

  • 相关阅读:
    http url转义字符,特殊字符
    No bean named &#39;cxf&#39; is defined
    c语言中结构体指针
    Android fragment (二)
    文件I/O之C标准库函数和系统库函数差别
    计算机组成原理——主存与cache的映射关系
    openstack 用nova API 指定 compute node 创建 instance
    SQL存在一个表而不在还有一个表中的数据
    hdu 2602
    小金登陆游戏
  • 原文地址:https://www.cnblogs.com/MattCheng/p/8621707.html
Copyright © 2020-2023  润新知