2017-09-21 1 views
2

J'ai JSON que je voudrais DeserializeObject dans un outerDictionary avec innerDictionary et innermostClass comme si:Deserialize JSON imbriqué dans le dictionnaire, la chaîne et la classe

var entityMap = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, fieldClass>>>(File.ReadAllText("map.json")); 

Cependant, le innerDictionary peut avoir une chaîne : chaîne au lieu de chaîne: innerMostClass.

{ 
"Client": { 
    "__class__": "contact", 

    "ClientId": { 
     "__field__": "new_ndisclientid", 
     "__type__": "string" 
    }, 
    "GivenName": { 
     "__field__": "firstname", 
     "__type__": "string" 
    }, 
}, 
"Case": { 
    "__class__": "contact", 

    "CaseId": { 
     "__field__": "new_ndiscaseid", 
     "__type__": "string" 
    } 
} 
} 

Y a-t-il un moyen de le faire? Je ne veux pas tout transformer en Classes. Est-il possible de le faire avec un JsonConverter personnalisé?

EDIT: renommé nom_classe à entityName pour plus de clarté. ClientId et GivenName seront désérialisés dans fieldClasses.

Répondre

2

Vous pouvez utiliser dynamique ou un objet au lieu de classe interne

var json = 
     "{\r\n\t\"Client\": {\r\n\t\t\"__entityName__\": \"contact\",\r\n\r\n\t\t\"ClientId\": {\r\n\t\t\t\"__field__\": \"new_ndisclientid\",\r\n\t\t\t\"__type__\": \"string\"\r\n\t\t},\r\n\t\t\"GivenName\": {\r\n\t\t\t\"__field__\": \"firstname\",\r\n\t\t\t\"__type__\": \"string\"\r\n\t\t}\r\n\t}\r\n}"; 
    var deserialized = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, dynamic>>>(json); 
List<object> values = deserialized.SelectMany(result => result.Value).Cast<object>().ToList(); 

Si vous voulez la classe intérieure séparée

public class Client 
{ 
    public string __entityName__ { get; set; } 
    public Dictionary<string, string> ClientId { get; set; } 
    public Dictionary<string, string> GivenName { get; set; } 
} 
var deserializedWithClass = JsonConvert.DeserializeObject<Dictionary<string, Client>>(json); 
+0

J'ai essayé dynamique mais je préfère que ce soit une classe ou quelque chose de similaire, si possible. Je veux que la classe possède des méthodes et le type de données dynamique n'a pas IntelliSense dans Visual Studio. –

+0

Réponse mise à jour avec classe au lieu de dynamique – Abhay

+0

Faire de la racine dans une classe est une autre manière. Mais je pense que cela doit être un dictionnaire/liste car la racine n'est pas toujours un client. Il peut être dit, un cas qui a différentes classes internes, mais ils ont les mêmes champs. J'ai mis à jour le post JSON original pour montrer ce que je veux dire. –