2011-10-01 3 views
1

Je développe une application Android qui lancera un certain nombre d'appels d'API qui renvoient des structures de données JSON, puis stockent les résultats dans un fournisseur de contenu. Différents appels d'API renvoient différentes structures de données JSON et sont mappés à un schéma de table correspondant dans le fournisseur de contenu. Je suis à la recherche d'une méthode simple et Java-esque pour mapper des propriétés dans un JSONObject à un objet ContentValues ​​plat. J'ai commencé à utiliser un simple HashMap et itérer sur ses chaînes de caractères de mappage entrySet dans JSONObject pour valoriser les chaînes de l'objet ContentValues, mais je voudrais prendre en compte le fait que certaines propriétés JSON sont des entiers ou des booléens. Aussi, dans certains cas, je voudrais un mapping plus complexe tel qu'un JSONArray dans une chaîne séparée par des virgules. En C, je ferais probablement cela avec un nom de tableau struct, une valeur, un type, et un callback optionnel pour gérer des mappages plus complexes.Meilleure technique pour mapper des données JSON dans ContentValues ​​

MISE À JOUR: En raison de la nature hiérarchique de la structure de données JSON et du fait qu'elle peut réellement avoir des sous-tables à certaines profondeurs, j'ai adopté l'approche suivante.

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); 
     } 
    } 
} 

Cela défini, j'ai peut créer des applications comme ceci:

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); 

Mais il semble encore comme il a besoin d'un peu de travail bien maillage.

+0

Voir ma réponse dans http://stackoverflow.com/questions/15819406/convert-json-to-contentvalues/18838578#18838578 – nanounanue

Répondre

1

Peut-être que vous pouvez construire une classe et l'utiliser dans le hashmap, je ne sais pas ce qui est votre type, mais par exemple

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

Vous pouvez essayer d'utiliser gson de google, créer une structure pour votre objet puis les mapper à l'objet .. vous pouvez également spécifier quel type de données et types de primitives de soutien ..

Questions connexes