我一直在浏览各种网站和json.net文档,但我找不到一种优雅的方法来做到这一点。
问题
我必须在特定日期开始解析GitHub提交的列表。
我一直在用于测试的示例JSON文件:示例JSON文件
JSON只是一个大(或空)数组。问题是我不需要所有数据,我只需要每个提交的SHA即可。但是,如果您查看数组中的每种类型,则有多个SHA。
有基本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)
- 我真的不想为此创建一个新的对象类型。
您可以很容易地将linq到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表达式,但这在统一性中应该很好 - 它仅支持 clr v2,但是.NET 3.5框架,我相信。
将来,我不会让诸如"它只是代码库的一小部分"之类的关注点使您创建一种类型 - 如果Linq到JSON不存在,为提交创建模型类型并进行了挑选。对此将是一个很好的解决方案。
如果您真的不需要新类型,则可以使用匿名类型对其进行验证。http://www.newtonsoft.com/json/help/html/deserializeannomentype.htm