2017-09-14 5 views
0

Ma charge utile ressemblerait à quelque chose comme ceci:C# Dictionnaire JSON Deserialize <string, Dictionary <string, string >> optionnel?

{ 
    "REFERENCE": "1", 
    "FIELDS" : { 
     "CUST" : "1234", 
     "PROD" : "PR2134", 
     "LIMIT" : "12345", 
     "LINES" : { 
       "LINE" : "01", 
       "DATA" : "12" 
     } 
    } 
} 

Mon objet a simplement ce qui suit:

public class TriggerRequest 
{ 
    public string reference { get; set; } 
    public Dictionary<string, string> fields { get; set; } 

} 

De toute évidence, cela ne gère pas les lignes d'objet. Comment puis-je créer une classe qui désérialise une charge utile entrante où quelque chose comme LINES est dynamique (c'est-à-dire que je peux envoyer n'importe quel dictionnaire) à n'importe quel point de la charge utile et se désérialise correctement Est-ce quelque chose quand j'ai besoin de créer un JSONConverter personnalisé ?

+0

C'est parce qu'il est sensible à la casse .. – Steve

+1

Avant de commencer à rouler votre propre convertisseur JSON vous devriez regarder dans certains des paquets déjà disponibles, y compris JSON.net et 'System.Json' de Silverlight La plupart d'entre eux ont la capacité de désérialiser en dynamique ou' Dictionary ' –

+0

' JObject obj = JsonConv ert.DeserializeJson (string json) 'de la bibliothèque' Newtonsoft.Json' (AKA Json.net) fonctionnerait probablement bien pour ce que vous essayez d'accomplir. –

Répondre

2

vous pouvez utiliser dynamic à la place.

public class TriggerRequest 
{ 
    public string reference { get; set; } 
    public dynamic fields { get; set; } 
} 

Cela devrait vous permettre d'accéder directement (string)request.fields.lines.data dans votre code, par exemple.

Cependant, si vous ne savez pas quelles valeurs compilation sera là, vous pouvez préférer faire des champs JObject .

public class TriggerRequest 
{ 
    public string reference { get; set; } 
    public JObject fields { get; set; } 
} 

Cela vous donne la possibilité d'écrire du code qui inspecte ce type de données est dans chacune de ses propriétés et répondre en conséquence.

Enfin, si vous faites savoir quelles sont les propriétés que vous attendez d'avoir fields, créer une catégorie distincte pour elle.

public class TriggerRequest 
{ 
    public string reference { get; set; } 
    public TriggerRequestFields fields { get; set; } 
} 

public class TriggerRequestFields 
{ 
    public string cust {get;set;} 
    ... 
    public TriggerRequestLines lines {get;set;} 
} 

public class TriggerRequestLines 
{ 
    public string line {get;set;} 
    public string data {get;set;} 
} 
0

Essayez de changer

public Dictionary<string, dynamic> fields { get; set; } 

Avec

public Dictionary<string, object> fields { get; set; }