利用fastjson反序列化json为对象和对象数组

Posted kaixinyufeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用fastjson反序列化json为对象和对象数组相关的知识,希望对你有一定的参考价值。

利用fastjson反序列化json为对象和对象数组

利用 fastjosn 将 .json文件 反序列化为 java.class 和 java.util.List

fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发。
【主要特点】
1、快速FAST (比其它任何基于Java的解析器和生成器更快,包括jackson)
2、强大(支持普通JDK类包括任意Java Bean Class、Collection、Map、Date或enum)
3、零依赖(没有依赖其它任何类库除了JDK) —— [ 开源中国社区]

一、反序列化函数

1、parseObject [将 json字符串 反序列化为 java.class]

//transform the json to T
-fastjson 为 json格式的字符串(String类型)
-T 为 与 json格式对应的自定义java.class
@sherineZJU List<T> temp= JSON.parseObject(fastjson,T.class);

2、parseArray[将 json字符串 反序列化为 java.util.List]

//transform the json to List<T>
-fastjson 为 json格式的字符串(String类型) -List< T> 为 与 json格式对应的 自定义 java.util.List。
@sherineZJU List<T> oldk = JSONArray.parseArray(fastjson,T.class);

注意:json字符串的关键字一定要与 java.class 中的对应变量名相同

实例1:JSON转化为HashMap&ArrayList

【0】首先在Maven中引入fastjson(pom.xml中引入依赖)

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

注:若未应用Maven,可以下载Jar包

http://code.alibabatech.com/mvn/releases/com/alibaba/fastjson/1.0.4/fastjson-1.0.4.jar

http://code.alibabatech.com/mvn/releases/com/alibaba/fastjson/1.0.4/fastjson-1.0.4-sources.jar

【1】定义实体类

//定义实体类
public class PlatformModel {
    private String id;
    private String name;
    private String platcode;

   //增加get/set方法
}

【2】定义测试方法

public class Test {
    String platforms = "[{\'id\':\'0\',\'name\':\'A\',\'platcode\':\'p1\'}," +
                         "{\'id\':\'1\',name:\'B\',\'platcode\':\'p2\'}," +
                         "{\'id\':\'2\',name:\'C\',\'platcode\':\'p3\'}," +
                         "{\'id\':\'3\',name:\'D\',\'platcode\':\'p4\'}]";
    //其中key为id,值为对象自己
    private Map<String, PlatformModel> platformMap = new HashMap<>();
    //存储集合的ArrayList
    private ArrayList<PlatformModel> platformList = new ArrayList<>();

    //转换字符串为Java对象集合(HashMap存储)
    private Map<String, PlatformModel> getPlatformMap() {
        JSONArray platformArray = JSON.parseArray(platforms);
        for (Object jsonObject : platformArray) {
            PlatformModel platformModel = JSONObject.parseObject(jsonObject.toString(), PlatformModel.class);
            platformMap.put(platformModel.getId(), platformModel);
        }
        return platformMap;
    }

    //转换字符串为Java对象集合(ArrayList存储)
    private ArrayList<PlatformModel> getPlatformList() {
        JSONArray platformArray = JSON.parseArray(platforms);
        for (Object jsonObject : platformArray) {
            PlatformModel platformModel = JSONObject.parseObject(jsonObject.toString(), PlatformModel.class);
            platformList.add(platformModel);
        }
        return platformList;
    }

    public static void main(String[] args) {
        Test test = new Test();
        test.getPlatformMap();
        test.getPlatformList();
    }

【3】输出结果

&&

项目实例实现:获取属性文件JSON值,并转换成对象返回前端(用户菜单权限)

Step1:定义实体类

//用户账号表
public class AccountUser implements Serializable {
    private static final long serialVersionUID = 7247714666080613254L;
    private String pin;
    private String traceaccount;
    private Boolean isAdmin;
    private List<Menu> menus;

   //增加get/set方法
}
//菜单表
public class Menu {
    private String type;
    private String index;
    private String name;//菜单名
    private boolean expanded;
    private String icon;
    private String link;
    private List<Menu> children;//子菜单

//增加get/set方法
}

Step2:配置属性文件menus值

//在config.porperties中引入JSON值,JSON值可用JSON压缩转义工具压缩为1行
menus=
[{
    type: \'group\',
    index: \'menu1_1\',
    name: \'菜单A\',
    expanded: false,
    children: [{
        type: \'link-item\',
        index: \'menu1\',
        name: \'菜单A-1,
        expanded: false,
        icon: \'area-chart\',
        link: \'/menu1\',
        children: []
    }, {
        type: \'link-item\',
        index: \'menu2\',
        name: \'菜单A-2\',
        expanded: false,
        icon: \'phone\',
        link: \'/menu2\',
        children: []
    }, ]
}]

Step3:获取属性文件值

//框架自定义方式
public class SwitchConfigBean extends BaseConfig implements ConfigDomainInitBean, java.io.Serializable{
private String menus= PropertyConfigurer.getProperty("menus");
//menus的get/set方法
//重写toString()方法

Step4:将JSON转化为对象返回【核心】

public AccountUser getAccountUser(String pin) {
        /* 1.根据pin获取traceaccount
           2.判断traceaccount是否存在,若存在则获取该pin是否是管理员身份
           3.根据pin获取是否是管理员
           4.根据pin获取menu权限
        */
        AccountUser accountUser = new AccountUser();
        //验证是否具有访问系统权限
        if(ArrayUtils.contains(ResourceContainer.switchConfigBean.getSystemPrivilegers(), pin)){
            String traceaccount = accountUserMapper.getTraceAccountByPin(pin);
            if (traceaccount != null) {
                accountUser.setPin(pin);
                accountUser.setTraceaccount(traceaccount);
                //验证当前登录PIN是否为管理员身份
                if (ArrayUtils.contains(ResourceContainer.switchConfigBean.getPrivilegers(), pin)) {
                    accountUser.setAdmin(true);
                } else {
                    accountUser.setAdmin(false);
                }
                //根据pin获取菜单权限,先从配置文件获取菜单权限
                JSONArray menuArray = JSON.parseArray(ResourceContainer.switchConfigBean.getMenus());
                if(!menuArray.isEmpty()){
                    ArrayList<Menu> menus= new ArrayList<>();
                    for (Object jsonObject : menuArray) {
                        Menu menu = JSONObject.parseObject(jsonObject.toString(), Menu.class);
                        menus.add(menu);
                    }
                    accountUser.setMenus(menus);
                }
            }
        }
        return accountUser;
    }

 

以上是关于利用fastjson反序列化json为对象和对象数组的主要内容,如果未能解决你的问题,请参考以下文章

(JSON) 序列化和反序列化,这个是啥意思呀?

JSON.net 反序列化返回一个空对象

序列化和反序列化

C#为JSON序列化和反序列化创建一个.NET对象[重复]

在json反序列化中将对象保持为字符串

无法反序列化当前的JSON对象,为啥