【发布时间】:2016-06-02 14:06:19
【问题描述】:
我正在尝试使用 Objectify 作为持久层将 JSON 文档存储到 AppEngine 数据存储中。为了能够查询文档值,而不是将整个文档插入为 String 字段,我创建了一个 MapEntity,如下所示:
@Entity(name="Map")
public class MapEntity {
@Id
private Long id;
private Map<String,String> field;
// Code omitted
}
因为最终“展开”时 JSON 文档中的每个键值都可以用 Map 表示
例子:
String subText = "{\"first\": 111, \"second\": [2, 2, 2], \"third\": 333}";
String jsonText = "{\"first\": 123, \"second\": [4, 5, 6], \"third\": 789, \"fourth\":"
+ subText + "}";
我会将地图字段存储在数据存储中:
KEY VALUE
field.first => 123
field.second => [4,5,6]
field.third => 789
field.fourth-first => 111
field.fourth-second => [2,2,2]
field.fourth-third => 333
如果我使用我的parse() 方法:
使用 JSON.Simple 库解析 JSON 文档,然后进行递归解析:
private MapEntity parse(String root, MapEntity entity, Map json) {
Iterator iter = json.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
if (entry.getValue() instanceof Map){
entity = parse((String)entry.getKey()+"-", entity, (Map) entry.getValue());
System.out.println("Map instance");
} else {
entity.setField(root + String.valueOf(entry.getKey()), String.valueOf(entry.getValue()));
}
}
return entity;
}
我的应用是这样工作的:
MapEntity jsonEntity = new MapEntity();
Map json = null;
json = (Map) parser.parse(jsonText, containerFactory); // JSON.Simple parser
jsonEntity = parse("", jsonEntity, json);
我遇到的问题是:
- 我不能使用“.” Map 键字段中的点,所以我必须使用“-”
- 另外,我存储 JSON 文档的方法效率不高
【问题讨论】:
标签: google-app-engine objectify json-simple