将JSON数据映射到ContentValues的最佳技术

时间:2011-10-01 03:55:01

标签: java android

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

但似乎还需要一点工作才能很好地融合。

2 个答案:

答案 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,为你的对象创建一个结构,然后将它们映射到对象..你可以指定什么数据类型和支持基元类型..