Java Map <string,map <string,=“”object =“”>&gt;转换为String并返回

时间:2015-12-02 07:07:47

标签: java dictionary hashmap

我有课程字段

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
}

2 个答案:

答案 0 :(得分:2)

使用

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可以序列化私有字段并自动忽略瞬态字段

答案 1 :(得分:0)

或使用序列化,并将其编码为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();

是可序列化的,你的班级必须是那样的

public class myclass实现Serializable

你应该(不是强制性的)在

中声明

private static final long serialVersionUID = 6569837232917408380L;

如果里面的任何内容也可以序列化,那就OK(标准类型是,集合,......)