LINQ to JSON - Newtonsoft.Json.Linq.JProperty Error



以下是我的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吗?

想想你的JSON是什么。你从字典中选择,所以LINQ中的结果就是属性。然后,您试图访问一个没有意义的属性上的"名称",这会导致错误。

你已经有了工作代码:

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

您可以使用两种方法获得所需的值:

方法1:

首先,您需要从JToken转换为JObject,因为"Issuer"的值是一个对象:

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 等网站为您生成这些

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;

最新更新