2017-11-08 1 views
-1

Ich erhalte JSON von einer bestimmten API hat eine dynamische Eigenschaft.C# JSONConverter benutzerdefinierte Serialisierung

Ich habe einen benutzerdefinierten JsonConverter Ansatz genommen. Gibt es einen einfacheren Weg, damit umzugehen?

Hier ist die JSON zurückgegeben:

{ 
    "kind": "tm:ltm:pool:poolstats", 
    "generation": 1, 
    "selfLink": "https://localhost/mgmt/tm/ltm/pool/test-mypoolname_https_main/stats?ver=12.1.2", 
    "entries": { 
     "https://localhost/mgmt/tm/ltm/pool/test-mypoolname_https_main/~Common~test-mypoolname_https_main/stats": { 
      "nestedStats": { 
       "kind": "tm:ltm:pool:poolstats", 
       "selfLink": "https://localhost/mgmt/tm/ltm/pool/test-mypoolname_https_main/~Common~test-mypoolname_https_main/stats?ver=12.1.2" 
      } 
     } 
    } 
} 

Die "entries": { "https://..." }, dass ein Teil ist, der immer ändert, je nachdem, was ich von der API anfordern.

Hier ist die Klassenstruktur, die diese Informationen halten:

public partial class PoolStatistics 
{ 
    [JsonProperty("entries")] 
    public EntriesWrapper Entries { get; set; } 

    [JsonProperty("generation")] 
    public long Generation { get; set; } 

    [JsonProperty("kind")] 
    public string Kind { get; set; } 

    [JsonProperty("selfLink")] 
    public string SelfLink { get; set; } 


    [JsonConverter(typeof(PoolEntriesConverter))] 
    public partial class EntriesWrapper 
    { 
     public string Name { get; set; } 

     [JsonProperty("nestedStats")] 
     public NestedStats NestedStats { get; set; } 
    } 

    public partial class NestedStats 
    { 
     [JsonProperty("kind")] 
     public string Kind { get; set; } 

     [JsonProperty("selfLink")] 
     public string SelfLink { get; set; } 
    } 
} 

außer Kraft setzen zu Deserialize über die folgenden auf dem PoolEntriesConverter:

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
{ 
    JObject jo = JObject.Load(reader); 
    NestedStats nestedStats = (jo.First.First[NESTED_STATS]).ToObject<NestedStats>(); 

    EntriesWrapper entries = new EntriesWrapper 
    { 
     NestedStats = nestedStats, 
     Name = jo.First.Path 
    }; 

    return entries; 
} 

außer Kraft gesetzt WriteJson (Serialisierung) - Das wirft eine Ausnahme:

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
{ 
    EntriesWrapper entries = (EntriesWrapper)value; 

    JObject jo = new JObject(
     new JProperty(NESTED_STATS, entries.NestedStats), 
     new JProperty(entries.Name, entries.Name)); 
} 

Die Fehlerzustände:

System.ArgumentException: 'konnte nicht bestimmen JSON-Objekttyp für Typ F5IntegrationLib.Models.Pools.PoolStatistics + NestedStats'

Antwort

1

Wenn Sie deklarieren ein Modus wie

public class NestedStats 
{ 
    public string kind { get; set; } 
    public string selfLink { get; set; } 
} 

public class Entry 
{ 
    public NestedStats NestedStats { get; set; } 
} 

public class Root 
{ 
    public string kind { get; set; } 
    public int generation { get; set; } 
    public string selfLink { get; set; } 
    public Dictionary<string, Entry> entries { get; set; } 
} 

Dann können Sie deserialisieren als

var obj = JsonConvert.DeserializeObject<Root>(json); 
Verwandte Themen