我正在使用Realm for Android,我不得不处理地图存储。但是,Realm不支持地图,所以我按照建议here
为此做了一个解决方法但是当我将我存储的数据序列化为JSON时,输出远远超出预期。
预期的JSON:
{
"key1": "value1",
"key2": "value2",
"key3": "value3",
"key4": "value4"
}
我得到的是:
[{
"key": "key1",
"value": "value1"
},
{
"key": "key2",
"value": "value2"
},
{
"key": "key3",
"value": "value3"
}]
我的代码:
public class ActivityDetails extends RealmObject {
public RealmList<KeyValueStore> map;
public String bid;
public String s;
}
public class KeyValueStore extends RealmObject {
private String key;
private String value;
public void setKey(String key) {
this.key = key;
}
public void setValue(String value) {
this.value = value;
}
}
有没有办法按预期将数据序列化为数据?
编辑:以下是我的数据的完整对象(如预期的那样)
{
"s": "someValue",
"bid": "someValue",
"map": [
{
"key": "key1",
"value": "value1"
},
{
"key": "key2",
"value": "value2"
},
{
"key": "key3",
"value": "value3"
}
]
}
答案 0 :(得分:1)
可能为时已晚,但由于我试图解决同样的问题,我想出了编写自定义JSON序列化器/解串器的解决方案:
public class KeyValueSerializer implements JsonSerializer<RealmList<KeyValue>>,
JsonDeserializer<RealmList<KeyValue>> {
@Override
public JsonElement serialize(RealmList<KeyValue> src,
Type typeOfSrc,
JsonSerializationContext context) {
JsonObject keyValueJson = new JsonObject();
for(KeyValue keyValue : src) {
keyValueJson.addProperty(keyValue.getKey(), keyValue.getValue());
}
return keyValueJson;
}
@Override
public RealmList<KeyValue> deserialize(JsonElement json,
Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
Type type = new TypeToken<Map<String, String>>() {}.getType();
Map<String, String> data = new Gson().fromJson(json, type);
RealmList<KeyValue> keyValues = new RealmList<>();
for (Map.Entry<String, String> entry : data.entrySet()) {
KeyValue keyValue = new KeyValue();
keyValue.setKey(entry.getKey());
keyValue.setValue(entry.getValue());
keyValues.add(keyValue);
}
return keyValues;
}
}
KeyValue
类遵循与建议here相同的地图表示:
public class KeyValue extends RealmObject {
private String key;
private String value;
public KeyValue() {
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
RealmList
是一种通用类型,因此无法使用.class
进行处理。注册TypeToken
并调用Type
方法时,使用TypeAdapter
获取fromJson
:
Type keyValueRealmListType = new TypeToken<RealmList<KeyValue>>() {}.getType();
Gson gson = new GsonBuilder().registerTypeAdapter(keyValueRealmListType,
new KeyValueSerializer())
.create();
RealmList<KeyValue> keyValues = gson.fromJson(keyValuesJson,
keyValueRealmListType);
据我测试过,像这样的自定义序列化器/反序列化器应该以优先格式读取和写入JSON,就像它在问题中一样。我发现它有点hacky,但它确实起作用。
答案 1 :(得分:0)
如果
{
"key": "key1",
"value": "value1"
}
这表示您的整个数据,然后这应该是您的整个RealmModel。
public class MyObject extends RealmObject {
@PrimaryKey
private String key;
private String value;
// getters setters
}