Java基礎/利用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;
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM