0

以下は私のjson文字列です:

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

次のLINQクエリを実行しようとすると:

JObject feed = JObject.Parse(json);

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

次のエラーが表示されます。

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

ただし、以下は正常に機能します。

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

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

4

2 に答える 2

1

JSON とは何かを考えてみましょう。辞書から選択しているので、LINQ の結果はプロパティです。次に、意味をなさないプロパティの「名前」にアクセスしようとすると、エラーが発生します。

あなたはすでに作業コードを持っています:

var test1 = feed["DataFeed"]["Issuer"]["name"];
于 2016-04-06T00:33:55.387 に答える
0

次の 2 つの方法を使用して、必要な値を取得できます。

方法 1:

「Issuer」の値はオブジェクトであるため、まずJTokena から a へのキャストが必要です。JObject

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

次に、すべてのプロパティをループして「Name」という名前のプロパティを見つけ、その値を文字列として取得します。

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

方法 2:

JSON を扱いやすいオブジェクトに逆シリアル化することもできます。これを行うには、最初に JSON に相当する .net オブジェクトを作成する必要があります。Visual Studio を使用して、[編集] メニュー -> [形式を選択して貼り付け] -> [JSON をクラスとして貼り付け] からこれらを生成するか、JsonUtils.comなどの Web サイトを使用できます。

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;
于 2016-04-05T20:35:48.307 に答える