以下是我的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吗?
答案 0 :(得分:1)
想想你的JSON是什么。您正在从字典中进行选择,因此LINQ中的结果是属性。您正试图访问" name"在一个没有意义的属性上给你错误。
您已有工作代码:
var test1 = feed["DataFeed"]["Issuer"]["name"];
答案 1 :(得分:0)
您可以使用两种方法获得所需的值:
方法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从“编辑”菜单中为您生成这些内容 - &gt;选择性粘贴 - &gt;将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;