1. 程式人生 > >fastjson:javabean按欄位(field)序列化儲存為Map並反序列化

fastjson:javabean按欄位(field)序列化儲存為Map並反序列化

大部分json工具對java物件整體序列化都提供了簡單的呼叫方式,以fastjson為例:

Model model = new Model();
String json = JSON.toJSONString(model); // 序列化
Model model2 = JSON.parseObject(json, Model.class); // 反序列化

需求說明

最近的專案應用到redis資料庫,需要將java bean儲存在redis資料庫。因為需要對資料庫中的某個欄位進行修改,所以在redis上不能用簡單的string型別儲存,而要以hash型別儲存。這就需要在向資料庫寫入java bean物件之前要將java bean按欄位序列化為一個Map<String,String>


而在從資料庫讀取後,又需要將所有欄位合併反序列化還原成一個java bean物件。

這裡寫圖片描述

序列化

實現步驟:
1.用JSON.toJSONString(Object)將java bean序列化為json String
2.用JSON.parseObject(String)將上一步的String反序列化為一個JSONObject(其實也是一個Map<String,Object>,JSONObject實現了Map介面).
3.對上一步中的JSONObject中每個欄位呼叫JSON.toJSONString(Object)進行序列化,最終生成符合redis資料庫hash型別儲存要求的Map<String,String>

反序列化

實現步驟:
1.從redis獲取所有欄位資料,也就是一個Map<String,String>.對Map中每個欄位的json string呼叫 JSON.parse(String)反序列化,生成一個Map<String,Object>,其中的Object就是欄位反序列化生成的物件
2.呼叫 com.alibaba.fastjson.util.TypeUtils.cast(Object , Type , ParserConfig)方法將上一步的Map

實現程式碼及測試

package net.gdface.facelog.message;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.junit.Test;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.serializer.SerializerFeature;

public
class TestFastjson { @Test public void testJSONObject() { Group group = new Group(); group.setId(0L); group.setName("admin"); User guestUser = new User(); guestUser.setId(2L); guestUser.setName("guest"); User rootUser = new User(); rootUser.setId(3L); rootUser.setName("root"); group.addUser(guestUser); group.addUser(rootUser); { ////////// 按欄位序列化 /////////////// // 序列化步驟1 String jsonstr = JSON.toJSONString(group); System.out.println(jsonstr); // 序列化步驟2 Map<String, Object> jsonObj = JSON.parseObject(jsonstr); // 序列化步驟3 for (Entry<String, Object> entry : jsonObj.entrySet()) { entry.setValue(JSON.toJSONString(entry.getValue())); } // 迴圈結束後 jsonObj 的資料型別為Map<String,String> ////////// 按欄位反序列化 /////////////// Map<String, Object> deJsonObj = new HashMap<String, Object>(); // 反序列化步驟1 for (Entry<String, Object> entry : jsonObj.entrySet()) { String json = (String) entry.getValue(); Object field = JSON.parse( json); deJsonObj.put(entry.getKey(), field); } // 迴圈結束時 Map<String, Object>中的每個欄位對應的Object都是反序列化後的物件 // 反序列化步驟2 Group dgroup = com.alibaba.fastjson.util.TypeUtils.cast(deJsonMap, Group.class, null); System.out.println(JSON.toJSONString(dgroup)); } } public interface Person<T>{ } public static class User implements Person<String>{ private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } public static class Group { private Long id; private String name; private List<User> users = new ArrayList<User>(); public Date date=new Date(); public java.sql.Date sqldate=new java.sql.Date(date.getTime()); public byte[] array=new byte[]{22,33,3,2,3,1,5,-1}; public String nullStr=null; private String privString="private string"; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<User> getUsers() { return users; } public void setUsers(List<User> users) { this.users = users; } public void addUser(User user) { users.add(user); } } }

總結

上面這個實現方式在序列化階段有兩次的序列化和一次反序列化,從效能角度看是不完美的。如果想實現一次序列化反序列化,需要對fastjson有更多的瞭解。