【问题标题】:Accessing nested JSON array访问嵌套的 JSON 数组
【发布时间】:2020-01-31 11:06:54
【问题描述】:

我有以下 JSON:

{
 "reviews": [
  {
   "reviewId": "123",
   "authorName": "author",
   "comments": [
    {
     "userComment": {
      "text": "text",
      "lastModified": {
       "seconds": "1580461776",
       "nanos": 1
      },
      "starRating": 5,
      "reviewerLanguage": "GB",
      "appVersionCode": "",
      "appVersionName": "",
      "thumbsUpCount": 0,
      "thumbsDownCount": 0
     }
    }
   ]
  }
 ]
}

从这里我想要访问的是starRating(但有可能进行多次审查)我已经成功地将 JSON 正确反序列化为 C# 对象,并在调试我的代码时检查了这一点。

到目前为止我有:

var appReview = JsonConvert.DeserializeObject<appData>(appJson);
var reviews = appReview.Reviews;
int reviewCount = reviews.Length;
for (int i = 0; i < reviewCount; i++)
{
    Console.WriteLine(reviews[0].Comments[0].UserComment.StarRating); 
}

但是我不只是想要这个特定评论的星级,因为将来会有更多评论和星级,因此我需要选择 JSON 中的所有评论并获得平均星级?因此,我不确定使用[0] 索引访问它们是否正确。希望我已经解释得足够好-谁能指出我正确的方向?

【问题讨论】:

  • 那么,每条评论可以有几个cmet,而每一个cmet可以有一个star rating?所以实际上每条评论都可以有多个评级?这似乎很奇怪 - 你确定这就是你想要的吗?

标签: c# arrays json serialization


【解决方案1】:

如果您习惯使用 linq,那么我建议您这样做:

var ratings = appReview.Reviews
                       .SelectMany(r => r.Comments.Select(c => c.UserComment.StarRating));

这应该会为您提供评分列表。这通过从Comments 中选择StarRating 然后SelectMany 将数组展平为单个数组来工作。

然后你可以像这样使用获取平均值:

var average = ratings.Average();

Try it online

【讨论】:

    猜你喜欢
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多