2016-04-05 9 views
0

次は私のJSON文字列で次のように私が手LINQ Newtonsoft.Json.Linq.JPropertyエラー

JObject feed = JObject.Parse(json); 

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

:私は、次のLINQクエリを実行しよう

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

エラー:

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

しかし、次のことが正常に動作します:

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

このjson文字列でLINQを使用できない理由は何ですか?

+1

あなたは既に作業コードを持っていますか?あなたは '発行者 'の' JObject'を反復しています... –

+0

私は 'Apple'を取得する必要があります。私はこれをどのようにしなければならないのですか? –

+0

'Issuer'は内部の' JObject'です。 'JObject'からLinqを使うことはできません。詳しくはこちらをご覧ください。 – octavioccl

答えて

0

あなたは二つの方法使用する値を得ることができます:1

方法:あなたは「発行者」の値以来JObjectからJTokenからキャストを必要とする

まずオブジェクトです:

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

次に、すべてのプロパティをループ名「名前」を持つものを見つけるためには、文字列としてその値を取得する:

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

方法2:

また、取り扱いが容易であるオブジェクトにJSONをデシリアライズすることができます。まず、JSONの.netオブジェクト "equivalent"を作成する必要があります。 [編集]メニューから、あなたのためにこれらを生成するためのVisual Studioを使用することができます - >特殊貼り付け - クラスとして>貼り付けJSONをか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; } 
} 

のようなウェブサイトを使用すると、あなたが発行者名を取得するためにしなければならないすべてはこれです:

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

あなたのJSONが何であるかを考えてください。辞書から選択するので、LINQの結果がプロパティになります。あなたはエラーになる意味を持たないプロパティで "name"にアクセスしようとしています。あなたはあなたを与えるために、 `SELECT`を使用して期待される何

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

男性自身がここにいるので、私の解決策に関するコメントや改善方法は?また、Json.netに感謝します。 – Nasreddine