【问题标题】:LINQ to JSON - Newtonsoft.Json.Linq.JProperty ErrorLINQ to JSON - Newtonsoft.Json.Linq.JProperty 错误
【发布时间】:2016-04-05 19:44:48
【问题描述】:

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

【问题讨论】:

  • 您希望使用Select 给您带来什么?您正在迭代 JObjectIssuer...
  • 我应该得到Apple。我该怎么做?
  • Issuer 是一个内部JObject。您不能通过JObject 使用 Linq,请查看此link 了解更多详情
  • 要获得Apple,只需使用string x = (string) feed["DataFeed"]["Issuer"]["name"];
  • var x = (string)feed.SelectToken("DataFeed.Issuer.name"),如果缺少中间对象,则不会抛出空引用异常。

标签: c# linq json.net linq-to-json


【解决方案1】:

想想你的 JSON 是什么。您正在从字典中进行选择,因此 LINQ 中的结果就是属性。然后,您尝试访问一个没有意义的属性上的“名称”,这会给您带来错误。

你已经有了工作代码:

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

【讨论】:

  • 既然这个人自己在这里,有什么关于我的解决方案的问题或者我该如何改进它?另外,感谢 Json.net。
【解决方案2】:

你可以使用两种方法得到你想要的值:

方法一:

首先,您需要从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'.

方法二:

您还可以将 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多