2016-04-05 6 views
0

Das folgende ist mein json string:LINQ to JSON - Newtonsoft.Json.Linq.JProperty Fehler

string json = @"{ 
    '?xml' : { 
     '@version' : '1.0', 
     '@encoding' : 'UTF-8' 
    }, 
    'DataFeed' : { 
     '@FeedName' : 'AdminData', 
     'Issuer' : { 
      'id' : '95', 
      'name' : 'Apple', 
      'symbol' : 'AAPL' 
     } 
    } 
}"; 

Wenn ich versuche, die folgende LINQ-Abfrage zu tun:

JObject feed = JObject.Parse(json); 

var compInfo = feed["DataFeed"]["Issuer"] 
    .Select(c => c["name"]); 

ich folgendes erhalten Fehler:

`Cannot access child value on Newtonsoft.Json.Linq.JProperty.` 

jedoch die folgende funktioniert:

var test1 = feed["DataFeed"]["Issuer"]["name"]; 

Eine Idee, warum ich LINQ auf dieser JSON-Zeichenfolge nicht verwenden kann?

+1

Was würden Sie mit 'Select' erwarten Sie geben? Sie iterieren über das 'JObject' von' Issuer' ... –

+0

Ich sollte 'Apple' bekommen. Wie soll ich das machen? –

+0

'Aussteller' ist ein inneres' JObject'. Sie können Linq nicht von einem 'JObject' verwenden, überprüfen Sie diesen [link] (http://www.newtonsoft.com/json/help/html/QueryLINQtoJSON.htm) für weitere Details – octavioccl

Antwort

0

Sie können den Wert erhalten Sie mit zwei Methoden:

Methode 1:

Zuerst eine Besetzung von JToken zu einem JObject, da der Wert der ‚Emittent‘ brauchen, ist ein Objekt:

var compInfo = (JObject)feed["DataFeed"]["Issuer"]; 

dann Schleife durch alle Eigenschaften, die man mit dem Namen „Name“ finden dann ihren Wert als String erhalten:

var str = compInfo.Properties().First(x => x.Name == "name").ToObject<string>(); 
// str will contain the value 'Apple'. 

Methode 2:

Sie können auch die JSON in ein Objekt deserialisieren, die einfacher zu handhaben ist. Um das zu tun, müssen Sie zuerst ein .net-Objekt "Äquivalent" Ihres JSON erstellen. Sie können Visual Studio verwenden, um diese für Sie aus dem Menü Bearbeiten zu generieren -> Inhalte einfügen -> Einfügen JSON als Klassen oder eine Website verwenden, wie JsonUtils.com

public class Xml 
{ 

    [JsonProperty("@version")] 
    public string Version { get; set; } 

    [JsonProperty("@encoding")] 
    public string Encoding { get; set; } 
} 

public class Issuer 
{ 

    [JsonProperty("id")] 
    public string Id { get; set; } 

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

    [JsonProperty("symbol")] 
    public string Symbol { get; set; } 
} 

public class DataFeed 
{ 

    [JsonProperty("@FeedName")] 
    public string FeedName { get; set; } 

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

public class RootJsonObject 
{ 

    [JsonProperty("?xml")] 
    public Xml Xml { get; set; } 

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

Dann alles, was Sie tun müssen, um den Namen des Emittenten zu erhalten, ist dies :

var feed = JsonConvert.DeserializeObject<RootJsonObject>(json); 
var issuer = feed.DataFeed.Issuer.Name; 
1

Denken Sie darüber nach, was Ihr JSON ist. Sie wählen aus einem Wörterbuch aus, sodass das Ergebnis in LINQ die Eigenschaft ist. Sie versuchen dann, auf "Name" auf einer Eigenschaft zuzugreifen, die keinen Sinn macht, die Ihnen den Fehler gibt.

Sie haben bereits die Arbeitscode:

var test1 = feed["DataFeed"]["Issuer"]["name"]; 
+1

Da der Mann selbst hier ist, irgendwelche Kommentare über meine Lösung oder wie kann ich es verbessern? Danke auch für Json.net. – Nasreddine