使用AppEngine存储JSON文档

时间:2012-11-12 03:53:46

标签: google-app-engine objectify json-simple

我正在尝试使用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文档的方法效率不高

2 个答案:

答案 0 :(得分:0)

如果您的JSON遵循严格的格式,那么最好构建一个类来表示您的数据格式,并使用类似Jackson的库直接与该类进行序列化。您可以直接将该类用作Objectify中的实体类,但是否要执行取决于您是否要:

  • 存储并公开完全相同的数据集
  • 紧密结合您的存储和JSON表示

答案 1 :(得分:-1)

您可以使用JSONObject替换MapEntity,并使用toString()方法将json存储为google应用引擎作为字符串。检索后,您可以使用适当的构造函数恢复JSONObject。当然,这限制了您在应用引擎中对属性进行索引并对其进行查询的能力。

如果您希望Objectify为您执行此操作,您可以注册Translator来处理调用toString()和重建。