簡體   English   中英

Java地圖 <String, Map<String, Object> &gt;轉換為字符串並返回

[英]Java Map<String, Map<String, Object>> convert to String and back

我有課場

Map<String, Map<String, Object>> myMap;

我需要為ORMlite實施它,我想創建自定義Persister,但不知道將其轉換為字符串並返回的好方法。

我的堅持班:

import com.j256.ormlite.field.FieldType;
import com.j256.ormlite.field.SqlType;
import com.j256.ormlite.field.types.StringType;

import java.sql.SQLException;
import java.util.Map;

public class UserPersister extends StringType {

private static UserPersister INSTANCE;

private UserPersister() {
    super(SqlType.STRING, new Class<?>[] {Map.class});
}

public static UserPersister getInstance() {
    if (INSTANCE == null)
        INSTANCE = new UserPersister();
    return INSTANCE;
}

@Override
public Object javaToSqlArg(FieldType fieldType, Object javaObject) throws SQLException {
    Map<String, Map<String, Object>> map = (Map<String, Map<String, Object>>) javaObject;
    return map != null ? getString(map) : null;
}

@Override
public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) throws SQLException {
    return sqlArg != null ? getFromString((String) sqlArg) : null;
}

private String getString(Map<String, Map<String, Object>> map) {
    //implement
}

private Map<String, Map<String, Object>> getFromString(String json) {
    //implement
}

采用

new JSONObject(map);

您可以從其文檔http://www.json.org/javadoc/org/json/JSONObject.html獲得其他功能。 但是,這僅適用於String,String映射,而不適用於復雜的String,Object。

Gson還可以用於序列化任意復雜的對象。

使用方法如下:

Gson gson = new Gson(); 
String json = gson.toJson(myObject); 

Gson將自動將集合轉換為JSON數組。 Gson可以序列化私有字段並自動忽略瞬態字段

或使用序列化,並將其編碼為base64。

無論采用哪種解決方案,對象都必須是可序列化的(請參見下文)

結果不可讀,但安全且可移植。

// encoding
Map<Integer, Map<String,String>> mimss =new HashMap<Integer, Map<String,String>>();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(mimss);
oos.flush();
oos.close();
bos.close();
byte[] byteData = bos.toByteArray();
String serial= DatatypeConverter.printBase64Binary(byteData);

// decoding
byte[] byteData_reverse=DatatypeConverter.parseBase64Binary(serial);
ByteArrayInputStream bais = new ByteArrayInputStream(byteData_reverse);
Map<Integer, Map<String,String>> mimss_copy=(Map<Integer,Map<String,String>>) new ObjectInputStream(bais).readObject();

要可序列化,您的課程必須是這樣的

公共類myclass實現Serializable

並且您應該(不是強制性的)在內部聲明

專用靜態最終長serialVersionUID = 6569837232917408380L;

如果里面也有可序列化的東西,那就沒問題(標准類型是collections ...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM