2016-12-05 4 views
2

J'ai une structure de données avec plusieurs types imbriqués.Comment puis-je me connecter correctement à JObject.ToObject de Json.NET <T>()?

public class MyDataType { 
    public int InferrableInt { get; set; } 
    public float InferrableFloat { get; set; } 
    public InferrableNestedDataType MyINDT { get; set; } 
    public CustomNestedDataType MyCNDT { get; set; } 

    public class InferrableNestedDataType { 
     public int X { get; set; } 
     public int Y { get; set; } 
    } 
    public class CustomNestedDataType { 
     // Data processed in a way that can't be expressed through JSON 
     public string CustomData { get; set; } 

     public int NestedInferrableInt { get; set; } 
    } 
} 

La plupart de ces types imbriqués peuvent être déduits du comportement par défaut. J'ai également un JObject reçu d'une autre partie du code. Je voudrais pouvoir:

var mydt = jobjectInstance.ToObject<MyDataType>() 

... et seulement exécuter un code personnalisé lors de la désérialisation MyDataType.CustomNestedDataType. Chaque solution que j'ai trouvé a étendu JsonConverter, mais autant que je peux dire cela ne fonctionne que lors de l'analyse à partir de JSON brut, et non un JObject pré-analysé. Quelle est la bonne façon de le faire, sans écrire de code personnalisé pour les types de données inférescibles?

Répondre

1

Chaque solution que j'ai trouvé a JsonConverter étendu, mais pour autant que je sache cela ne fonctionne que lorsque l'analyse syntaxique de JSON brut

Il devrait fonctionner avec JObject.ToObject aussi bien. Vous avez au moins deux options:

  • Appliquer l'attribut JsonAttributeConverter à votre classe pour spécifier le convertisseur à utiliser:

    [JsonConverter(CustomNestedDataTypeConverter)] 
    public class CustomNestedDataType 
    

    (si elle est juste CustomNestedDataType.CustomData qui a besoin de sérialisation personnalisé, écrire un convertisseur pour que et appliquer l'attribut à la propriété)

  • Créer un JsonSerializer avec votre convertisseur, et le transmettre à JObject.ToObject:

    var serializer = new JsonSerializer(); 
    serializer.Converters.Add(new CustomNestedDataTypeConverter()); 
    
    var result = jObject.ToObject<MyDataType>(serializer); 
    
+0

Aha, a du sens. Je vous remercie! –