gpt4 book ai didi

java - Realm 从 map 序列化数据

转载 作者:行者123 更新时间:2023-11-30 10:33:45 24 4
gpt4 key购买 nike

我正在使用 Realm for Android,我必须处理 map 存储。但是,Realm 不支持 map ,所以我按照建议做了一个解决方法 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;
}
}

有没有办法像预期的那样序列化 map 数据?

编辑:以下是我的数据的完整对象(符合预期)

{
"s": "someValue",
"bid": "someValue",
"map": [
{
"key": "key1",
"value": "value1"
},
{
"key": "key2",
"value": "value2"
},
{
"key": "key3",
"value": "value3"
}
]
}

最佳答案

可能为时已晚,但由于我试图解决同样的问题,我想出了编写自定义 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 来寻址。在注册TypeAdapter 并调用fromJson 方法时,使用TypeToken 获取Type:

Type keyValueRealmListType = new TypeToken<RealmList<KeyValue>>() {}.getType();
Gson gson = new GsonBuilder().registerTypeAdapter(keyValueRealmListType,
new KeyValueSerializer())
.create();

RealmList<KeyValue> keyValues = gson.fromJson(keyValuesJson,
keyValueRealmListType);

据我测试,像这样的自定义序列化器/反序列化器应该像问题中那样以首选格式读取和写入 JSON。我觉得它有点老套,但它确实有效。

关于java - Realm 从 map 序列化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42061496/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com