【问题标题】:C# Parse list of git commits using json.netC# 使用 json.net 解析 git 提交列表
【发布时间】:2017-04-14 09:53:07
【问题描述】:

我一直在浏览各种网站和 JSON.net 文档,但我找不到一种优雅的方式来做到这一点。

问题

我必须解析自某个日期以来的 GitHub 提交列表。

我一直用于测试的示例 json 文件:example json file

json 只是一个大(或空)数组。问题是我不需要所有数据,我只需要每次提交的 sha。 但是,如果您查看数组中的每种类型,就会发现有多个 shas。

有基础sha:

"sha": "fde139ae1d8fcf82bb145bbc99ed41763202e28f",

树沙:

"tree": {
        "sha": "5d33d345f2df166bc4c56cc9307a61a5ee57d346",
        "url": "https://api.github.com/repos/QuiZr/ProjectPorcupineLocalization/git/trees/5d33d345f2df166bc4c56cc9307a61a5ee57d346"
      },

和父 sha(s):

"parents": [
      {
        "sha": "8b9b43e813645c3a66911247b3dca916af937738",
        "url": "https://api.github.com/repos/QuiZr/ProjectPorcupineLocalization/commits/8b9b43e813645c3a66911247b3dca916af937738",
        "html_url": "https://github.com/QuiZr/ProjectPorcupineLocalization/commit/8b9b43e813645c3a66911247b3dca916af937738"
      }
    ]

我只想要第一个 sha。不是其他 shas。

要求

  • 需要使用 JSON.net(不是 Ockokit)
  • 应该优雅
  • 需要支持Unity游戏引擎(即C#版本小于等于2.0)
  • 我真的不想为此创建新的对象类型。

【问题讨论】:

  • Unity...游戏引擎?我不认为它支持 C# only 直到 v. 2.0。
  • @FᴀʀʜᴀɴAɴᴀᴍ 根据这里的帖子:answers.unity3d.com/questions/924021/… 这是 .NET 2.0 我认为这与 C# 版本 2 相同?
  • @FᴀʀʜᴀɴAɴᴀᴍ:嗯,不,它支持 C# 语言 比这晚很多,但目前只支持 CLR v2.0,和 .NET 框架最高 3.5 I相信(有一些缺失的方面)。但是 Json.NET 支持 .NET 2.0,我认为……至少,有版本支持。
  • @JonSkeet 是的,我已经使用 Unity 安装了 Json.NET,它工作正常。
  • 对。但是,例如,您应该能够毫无问题地使用 C# 3 语言功能(例如匿名类型)。现在,为什么你不想为此创建一个新类型?这是让 Json.NET 工作的最简单方法之一 - 只需创建一个与 JSON 匹配的类型,然后对其进行反序列化。如果您不想这样做,您可以使用带有JObject.Parse 的 LINQ to JSON - 您尝试过吗?解释不寻常的要求并展示您迄今为止所做的尝试总是值得的。

标签: c# json github json.net github-api


【解决方案1】:

在这种情况下,您可以非常轻松地使用 LINQ to JSON - 将文本解析为 JArray,然后请求每个对象的 sha 属性:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Newtonsoft.Json.Linq;

class Test
{
    static void Main()
    {
        string json = File.ReadAllText("test.json");
        JArray array = JArray.Parse(json);
        List<string> hashes = array.Select(o => (string) o["sha"]).ToList();
        foreach (var hash in hashes)
        {
            Console.WriteLine(hash);
        }
    }
}

请注意,这使用来自 C# 3 的 lambda 表达式,但在 Unity 中应该没问题 - 它只支持 CLR v2,但我相信是 .NET 3.5 框架。

但在未来,我不会让诸如“它只是代码库的一小部分”之类的顾虑让您放弃创建类型 - 如果 LINQ to JSON 不存在,则为提交和反序列化创建模型类型这将是一个非常好的解决方案。

【讨论】:

  • 太棒了,像魅力一样工作。我也没有意识到嵌套类是一回事。只是一个简单的问题,为什么在 foreach 中使用 var?为什么不用字符串?
  • @hcorion var 只是类型的简写(在本例中为 string)。它只是更短(如果hashes 的类型发生变化,您不必更改它)。
【解决方案2】:

如果你真的不想要新类型,你可以使用匿名类型反序列化它。 http://www.newtonsoft.com/json/help/html/DeserializeAnonymousType.htm

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 2010-09-28
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多