我正在开发一个Android应用程序,它将启动许多返回JSON数据结构的API调用,然后将结果存储在内容提供程序中。不同的API调用返回不同的JSON数据结构并映射到内容提供程序中的相应表模式。我正在寻找一个简单的Java风格的方法来映射从JSONObject中的属性到平坦的ContentValues对象。我开始使用一个简单的HashMap并迭代它在JSONObject中的entrySet映射关键字符串来为ContentValues对象的值字符串,但我想说明一些JSON属性是整数或布尔值的事实。此外,在某些情况下,我希望将更复杂的映射(如JSONArray)转换为逗号分隔的字符串。在C中,我可能只是使用结构数组名称,值,类型和可选的回调来处理更复杂的映射。
更新:由于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);
但似乎还需要一点工作才能很好地融合。
答案 0 :(得分:1)
也许你可以构建一个类并在hashmap中使用它,我不知道你的类型是什么,但是例如
class Foo{
String name;
String value;
String type;
int opt;
}
.....
HashMap hm = new HashMap();
Foo foo = new Foo("123","123","type",1);
hm.put("100", foo);
.....
答案 1 :(得分:1)
你可以尝试使用谷歌的gson,为你的对象创建一个结构,然后将它们映射到对象..你可以指定什么数据类型和支持基元类型..