2016-05-05 1 views
4

Comment puis-je analyser avec Moshi une structure JSON qui a des touches qui sont inconnues au moment de la compilation:Moshi - Parse clés JSON inconnus

"foo": { 
    "name": "hello", 
    "bar": { 
    "unknownKey1": { 
     "a": "1" 
     } 
    }, 
    "unknownKey2": { 
     "b": "2" 
    }, 
    "unknownKeyX": { 
     "c": "X" 
    } 
    }, 
    "properties": {...} 
} 

J'ai essayé d'utiliser un adaptateur @FromJson pour JSONObject mais les journaux disent simplement que la JSON est vide {} (où je me attends {"unknownKey1": { ... etc ...})

class Foo { 

     @Json(name = "name") 
     String name; 
     @Json(name = "bar") 
     Bar bar; 

     static class Bar { 

     } 
    } 

class BarAdapter { 

    @FromJson 
    Bar fromJson(JSONObject json) { 
     Log.d("xxx", "got " + json.toString()); 
     return new Bar(); 
    } 
} 

une fois que je peux obtenir à l'intérieur JSON bar, je peux itérer manuellement ajouter à une liste ou quelque chose (puisque je ne sais pas combien d'éléments Il y aura).

En utilisant comme ceci:

  Moshi moshi = new Moshi.Builder() 
     .add(new BarAdapter()) 
     .add(new LinkedHashMapConverter()) 
     .build(); 

Je devais aussi ajouter le LinkedHashMapConverter pour apaiser les dieux Moshi, mais en ajoutant journalisez, ses méthodes ne sont jamais appelés (cela pourrait être une question séparée avec mon vrai json).

des idées?

Répondre

3

Utiliser une carte.

@FromJson 
Bar fromJson(Map<String, Baz> json) { 
    Log.d("xxx", "got " + json.toString()); 
    return new Bar(); 
} 

Si vous ne connaissez pas le type des valeurs de la carte, vous ne pouvez pas utiliser Object.

+0

Vous pouvez ou ne pouvez pas utiliser l'objet? – ataulm

+0

L'objet est spécial. Il va convertir en une carte, liste, double, chaîne ou booléen en fonction de ce que le JSON a. –