2015-12-02 2 views
0

У меня есть поле классаJava Map <String, Map <String, Object >> преобразовать в строку и обратно

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

Мне нужно реализовать для ORMlite, я хочу создать пользовательскую стойкую бактерию, но не знаю, хороший способ конвертировать его в строку и обратно.

Мой стойкая бактерия Класс:

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 
} 
+0

Возможные дубликат [Как конвертировать HashMap в объект JSON в Java] (http://stackoverflow.com/ Вопросы/12155800/how-to-convert-hashmap-to-json-object-in-java) –

ответ

0

или использовать сериализацию и кодировать его на base64.

независимо от решения вы принимаете, объекты должны быть serializables (смотри ниже)

результат не может быть прочитан, но это безопасно и портативный.

// 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 ;

Если что-то внутри в сериализации тоже все нормально (стандартные типы, коллекции, ...)

+0

спасибо, это хороший способ для меня. – llaerto

2

Использование

new JSONObject(map); 

Другие функции, которые можно получить из документации http://www.json.org/javadoc/org/json/JSONObject.html. Но это работает только для String, String map, а не для сложной String, Object.

Gson также может использоваться для сериализации произвольно сложных объектов.

Вот как вы его используете:

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

Gson автоматически преобразует коллекции JSON массивов. Gson может сериализовать частные поля и автоматически игнорировать переходные поля

+0

Thx для ответа, я уже работал с Gson, но не помню, что библиотека GSON может конвертировать карту > и Map > в строку и обратно? – llaerto

Смежные вопросы