2016-04-28 10 views
0

Wenn ich Anfrage für eine bestimmte API senden, geben sie mir ein JSON, das ist toll, aber das Problem ist, dass je nach den Parametern, die ich zur Verfügung stellen, der Objektname ist immer anders als die Daten Struktur bleibt gleich. Also versuche ich, den JSON mit der Newtonsoft-Bibliothek in eine C# -Klasse zu konvertieren. Der einzige Weg, den ich gefunden habe, ist die Verwendung von JsonTextReader, aber ich frage mich, ob es einen saubereren Weg gibt, dies zu erreichen. Ich habe die Dokumentation nachgeschlagen und konnte nichts finden, was mir in dieser Hinsicht helfen könnte. Ich habe auch versucht, JValue.Parse für die dynamische Objekt-Mapping, aber da der Name der Eigenschaft immer anders ist, hilft es mir nicht. Hier ist ein Codebeispiel, das Problem zu veranschaulichen:Deserialize dynamischen Objektnamen für newtonsoft Eigenschaft

{ 
"error": [], 
    "result": { 
    //This property name always changes 
    "changingPropertyName": [ 
     [ 
     "456.69900", 
     "0.03196000", 
     1461780019.8014, 
     ]] 
    } 

//C# mapping 
public partial class Data 
{ 
    [JsonProperty("error")] 
    public object[] Error { get; set; } 

    [JsonProperty("result")] 
    public Result Result { get; set; } 
} 

public class Result 
{ 
    [JsonProperty("changingPropertyName")] 
    public object[][] changingPropertyName{ get; set; } 
} 
+1

Sie können dies nicht mit einem Attribut. Sie müssten einen benutzerdefinierten Konverter oder etwas Ähnliches schreiben. –

Antwort

1

Eine Möglichkeit, mit einem variablen Eigenschaftsnamen zu behandeln ist eine Dictionary<string, T> zu verwenden, in Ort einer stark typisierten Klasse (T ist der Typ der Variableneigenschaft, die Sie erfassen möchten). Zum Beispiel:

public partial class Data 
{ 
    [JsonProperty("error")] 
    public object[] Error { get; set; } 

    [JsonProperty("result")] 
    public Dictionary<string, object[][]> Result { get; set; } 
} 

können Sie dann die ersten KeyValuePair aus dem Wörterbuch und Sie werden sowohl den Namen der variablen Eigenschaft haben, und den Wert aus, dass zur Verfügung.

string json = @" 
{ 
    ""error"": [], 
    ""result"": { 
    ""changingPropertyName"": [ 
     [ 
     ""456.69900"", 
     ""0.03196000"", 
     1461780019.8014 
     ] 
    ] 
    } 
}"; 

var data = JsonConvert.DeserializeObject<Data>(json); 

KeyValuePair<string, object[][]> pair = data.Result.First(); 
Console.WriteLine(pair.Key + ":"); 
object[][] outerArray = pair.Value; 

foreach (var innerArray in outerArray) 
{ 
    foreach (var item in innerArray) 
    { 
     Console.WriteLine(item); 
    } 
} 

Fiddle: https://dotnetfiddle.net/rlNKgw

+0

Diese Lösung ist wirklich sauber, danke für die Hilfe! –

+0

Kein Problem; Ich bin froh, dass Sie es nützlich fanden. –

1

Sie es aC# dynamische deserialisieren kann mit:

dynamic dynamicObj= JsonConvert.DeserializeObject<dynamic>(jsonResultString); 
Verwandte Themen