2016-11-25 1 views
0

Ich habe folgende JSON, die ich deserialisieren bin versucht.Deserialisieren JSON gibt null zurück, C#

{ 
"output-parameters":[ 
    { 
    "value":{ 
     "array":{ 
      "elements":[ 
       { 
       "string":{ 
        "value":"cp-100" 
       } 
       }, 
       { 
       "string":{ 
        "value":"cp-101" 
       } 
       }, 
       { 
       "string":{ 
        "value":"cp-100" 
       } 
       }, 
       { 
       "string":{ 
        "value":"cp-101" 
       } 
       }, 
       { 
       "string":{ 
        "value":"cp-100" 
       } 
       } 
      ] 
     } 
    }, 
    "type":"Array/string", 
    "name":"Tags", 
    "scope":"local" 
    }, 
    { 
    "value":{ 
     "string":{ 
      "value":"subscribed" 
     } 
    }, 
    "type":"string", 
    "name":"Error", 
    "scope":"local" 
    } 
] 
} 

Ich habe folgende Klassen erstellt das JSON

public class OutputParameter 
{ 
    [JsonProperty(PropertyName = "value")] 
    public value value { get; set; } 

    [JsonProperty(PropertyName = "name")] 
    public string name { get; set; } 
} 

public class value 
{ 
    [JsonProperty(PropertyName = "array")] 
    public array_ array_ { get; set; } 
} 

public class array_ 
{ 
    [JsonProperty(PropertyName = "elements")] 
    public element[] element { get; set; } 
} 

public class element 
{ 
    [JsonProperty(PropertyName = "value")] 
    public string value { get; set; } 
} 

Ich bekomme keine Fehler zu binden, während ich es bin Deserialisieren. Auch ich kann leicht durch navigieren.

aber wenn ich, versuche, den Wert des Elements [n] (output_parameters [0] .value.array_.element [0] .value) zu erhalten. es gibt null zurück.

Was ist das Problem hier?

HINWEIS: Ich brauche nur wenige Werte von JSON genommen werden. Zum Beispiel brauche ich keine Werte wie "type": "string", "name": "Fehler", "scope": "local" Deshalb habe ich C# Klassen wie folgt erstellt.

+1

sollten nicht Sie suchen nach "output_parameters [0] .value.array_.element [0] .string.value"? –

+1

Verwenden Sie http://json2csharp.com/ zum Generieren der C# -Klassen von JSON? –

Antwort

3

Ihre Klasse sollte so aussehen, da output-parameters ein Array [ ist und es möglicherweise mehr Werte oder eine Liste enthält. Erstellen Sie also eine Rootobject, die die Liste der Ausgabeparameter enthält.

Jetzt output-parameters enthält nicht nur value und name, während es auch enthält. type und scope in der gleichen Hierarchie.

Sie haben keine Erklärung für den Knoten string genannt, die hier als SomeString genannt wird und SomeString1

Ihre Klasse Wert string enthält auch die hier als SomeString1

bezeichnet
public class Rootobject 
{ 
    [JsonProperty(PropertyName = "output-parameters")] 
    public List<OutputParameters> outputparameters { get; set; } 
} 
public class OutputParameters 
{ 
    [JsonProperty(PropertyName = "value")] 
    public SomeValue value { get; set; } 

    [JsonProperty(PropertyName = "type")] 
    public string type { get; set; } 

    [JsonProperty(PropertyName = "name")] 
    public string name { get; set; } 

    [JsonProperty(PropertyName = "scope")] 
    public string scope { get; set; } 
} 
public class SomeValue 
{ 
    [JsonProperty(PropertyName = "array")] 
    public SomeArray array { get; set; } 

    [JsonProperty(PropertyName = "string")] 
    public SomeString1 _string { get; set; } 
} 
public class SomeArray 
{ 
    [JsonProperty(PropertyName = "elements")] 
    public List<SomeElement> elements { get; set; } 
} 
public class SomeElement 
{ 
    [JsonProperty(PropertyName = "string")] 
    public SomeString _string { get; set; } 
} 
public class SomeString 
{ 
    [JsonProperty(PropertyName = "value")] 
    public string value { get; set; } 
} 
public class SomeString1 
{ 
    [JsonProperty(PropertyName = "value")] 
    public string value { get; set; } 
} 

Dann sollten Sie es deserialisieren die Verwendung von folgender Code

Rootobject ro = JsonConvert.DeserializeObject<Rootobject>(jsonstr); 
Console.WriteLine(ro.outputparameters[0].value.array.elements[0]._string.value);    

Bildschirmschoner t, die den Wert zeigt, wurde

extrahiert

ScreenShot

+0

Und öffentliche Eigenschaften sollten in PascalCase sein –

+0

@ManfredRadlwimmer: Dies ist nicht notwendig, während es einer der Standard der Namenskonventionen ist. –

+0

Dies sagt auch das gleiche .. Wert ist null :( – Sandaru