当前位置:   article > 正文

FastJSON自定义序列化_fast jsonobject 自定义序列化

fast jsonobject 自定义序列化

FastJSON自定义序列化

对接第三方机构调用接口的时候 , 经常遇到返回来的JSON格式非常复杂的情况

例如返回的报文为以下形式 , 如果解析不好的话, 不利于存取和阅读

{
  "key":"x",
  "value":"y"
}
  • 1
  • 2
  • 3
  • 4

我们期望的报文格式应该为:

{
  "x":"y"
}
  • 1
  • 2
  • 3

本文使用fastjson的ObjectDeserializer接口实现自定义JSON序列化

假设原始报文如下:

{
  "code": 0,
  "msg": "sucess",
  "data": {
    "personInfo": [
      {
        "key": "name",
        "value": "JOECD"
      },
      {
        "key": "age",
        "value": 50
      }
    ]
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

目标报文如下:

{
  "code": 0,
  "msg": "sucess",
  "data": {
    "personInfo": {
      "age": 50,
      "name": "JOECD"
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
1.定义实体类
@Getter
@Setter
public class Person {

    private String name;

    private int age;

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
@Setter
@Getter
public class Result {

    private int code;

    private String msg;

    private ResultData data;

    @Setter
    @Getter
    private static class ResultData {
        private Person personInfo;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
2.创建自定义解析器

我们要序列化的JSON层级结构是personInfo这一层

public class PersonDeserializer implements ObjectDeserializer {

    @Override
    public Person deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
        Person result = new Person();
        Class targetClass = Person.class;
        //拿到键值对
        List<Pair> infoList = parser.parseArray(Pair.class);
        for (Pair pair : infoList) {
        	//反射赋值
            Field field;
            try {
                field = targetClass.getDeclaredField(pair.getKey());
                field.setAccessible(true);
                field.set(result, pair.getValue());
            } catch (NoSuchFieldException | IllegalAccessException ignored) {

            }
        }
        return result;
    }

    @Override
    public int getFastMatchToken() {
        return 0;
    }

    @Setter
    @Getter
    private static class Pair {
        private String key;
        private Object value;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
3.给定义的字段加上解析器注解
@Setter
@Getter
private static class ResultData {
	@JSONField(deserializeUsing = PersonDeserializer.class)
    private Person personInfo;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
4.运行,查看结果
public static void main(String[] args) {
        String jsonStr = "{\n" +
                "  \"code\": 0,\n" +
                "  \"msg\": \"sucess\",\n" +
                "  \"data\": {\n" +
                "    \"personInfo\": [\n" +
                "      {\n" +
                "        \"key\": \"name\",\n" +
                "        \"value\": \"JOECD\"\n" +
                "      },\n" +
                "      {\n" +
                "        \"key\": \"age\",\n" +
                "        \"value\": 50\n" +
                "      }\n" +
                "    ]\n" +
                "  }\n" +
                "}";
        Result result = JSON.parseObject(jsonStr, Result.class);
        System.out.println(JSON.toJSONString(result));
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

输出:

{"code":0,"data":{"personInfo":{"age":50,"name":"JOECD"}},"msg":"sucess"}
  • 1
5.最后

解析k-v型的JSON只是工作中刚好遇到一个例子,自定义JSON序列化还可以扁平化JSON,优化层级结构等等,大家可以自行开发

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/966312
推荐阅读
相关标签
  

闽ICP备14008679号