我正在开发一个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