2011-10-01 115 views
1

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

但它仍然看起来像它需要一点工作,以网格很好。

+0

在http://stackoverflow.com/questions/15819406/convert-json-to-contentvalues/18838578#18838578看到我的答案 – nanounanue

回答

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

你可以尝试使用谷歌的gson,为你的对象创建一个结构,然后将它们映射到对象..你可以指定什么样的数据类型和支持原始类型以及..