我正在開發一個Android應用程序,它將啓動一些API調用,以返回JSON數據結構,然後將結果存儲在內容提供程序中。不同的API調用返回不同的JSON數據結構並映射到內容提供者中的相應表模式。我正在尋找一種簡單的Java方法來將JSONObject中的屬性映射到平坦的ContentValues對象。我開始使用一個簡單的HashMap並遍歷它的JSONObject中的entrySet映射關鍵字字符串來爲ContentValues對象賦值,但我想說明一些JSON屬性是整數或布爾值的事實。此外,在某些情況下,我想將更復雜的映射(如JSONArray)轉換爲逗號分隔的字符串。在C中,我可能只需要使用struct數組名,值,類型和可選的回調來處理更復雜的映射。將JSON數據映射到ContentValues的最佳技術
UPDATE:由於JSON數據結構的層次性質,並且由於它實際上可以在某些深度具有子表,所以我採取了以下方法。
private static interface MapJSON {
public void mapData(JSONObject object, ContentValues values)
throws JSONException;
}
private static abstract class AbstractMapJSON implements MapJSON {
protected final String mJSONName;
protected final String mContentName;
public AbstractMapJSON(String jsonName, String contentName) {
mJSONName = jsonName;
mContentName = contentName;
}
public abstract void mapData(JSONObject object, ContentValues values)
throws JSONException;
}
/* This is the basic template for each of the basic types */
private static class BooleanMapJSON extends AbstractMapJSON {
public BooleanMapJSON(String jsonName, String contentName) {
super(jsonName, contentName);
}
public void mapData(JSONObject object, ContentValues values)
throws JSONException {
values.put(mContentName, object.getBoolean(mJSONName));
}
}
/* This class takes a nested JSON Object and flattens it into the same table */
private static class ObjectMapJSON implements MapJSON {
protected final String mJSONName;
protected final MapJSON[] mMap;
public ObjectMapJSON(String jsonName, MapJSON[] map) {
mJSONName = jsonName;
mMap = map;
}
public void mapData(JSONObject object, ContentValues values)
throws JSONException {
JSONObject subObject = object.getJSONObject(mJSONName);
for(MapJSON mapItem: mMap) {
mapItem.mapData(subObject, values);
}
}
}
隨着該定義,我已經可以像這樣創建映射:
private static final MapJSON[] mainSiteMap = new MapJSON[] {
new StringMapJSON("name", StackPad.Sites.NAME),
new LongMapJSON("creation_date", StackPad.Sites.CREATION_DATE),
new StringMapJSON("description", StackPad.Sites.DESCRIPTION),
};
private static final MapJSON sitesMap = new ObjectMapJSON("main_site", mainSiteMap);
但它仍然看起來像它需要一點工作,以網格很好。
在http://stackoverflow.com/questions/15819406/convert-json-to-contentvalues/18838578#18838578看到我的答案 – nanounanue