2011-10-01 56 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,爲你的對象創建一個結構,然後將它們映射到對象..你可以指定什麼樣的數據類型和支持原始類型以及..