2012-11-12 35 views
1

我試圖使用Objectify作爲持久層將JSON文檔存儲到AppEngine數據存儲中。爲了能夠查詢文件值,而不是僅僅將整個文檔作爲String場,我創建了一個MapEntity它看起來像這樣:用AppEngine存儲JSON文檔

@Entity(name="Map") 
public class MapEntity { 
    @Id 
    private Long id; 
    private Map<String,String> field; 
     // Code omitted 
} 

由於最終當「展開」每次JSON文件中的鍵值可以與地圖來表示

實施例:

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

我遇到的問題有:

  • 我無法使用「。」點在地圖鍵字段,所以我必須用「 - 」
  • 也是我在存儲JSON文件的方法是不是很有效

回答

-2

您可以使用JSONObject爲您MapEntity更換和儲存JSON Google App Engine的作爲使用toString()方法的字符串。檢索後,您可以簡單地使用適當的構造函數恢復JSONObject。這當然會限制您在應用程序引擎中對屬性進行索引並對它們進行查詢的能力。

如果你想Objectify爲你做這件事,你可以註冊一個Translator來照顧調用toString()和重建。

+0

JSONObject的斷開鏈接 – coto

+0

@coto斷開的鏈接已修復。 –

0

如果你的JSON遵循嚴格的格式,你可能會更好關閉構建一個類來表示您的數據格式,並使用像Jackson這樣的庫直接從該類序列化。您可以直接使用該類作爲物化實體類,但無論你想做的事取決於您是否想:

  • 商店和揭露完全相同的一組數據的
  • 緊密結合您的存儲和JSON申述