我一直在浏览各种网站和JSON.net文档,但我找不到一种优雅的方法来做到这一点。
我必须解析自某个日期以来的GitHub提交列表。
我一直用于测试的示例json文件:example json file
json只是一个大型(或空)数组。问题是我不需要所有的数据,我只需要每个提交的sha。 但是,如果查看数组中的每个类型,则会有多个shas。
有基础sha:
"sha": "fde139ae1d8fcf82bb145bbc99ed41763202e28f",
树sha:
"tree": {
"sha": "5d33d345f2df166bc4c56cc9307a61a5ee57d346",
"url": "https://api.github.com/repos/QuiZr/ProjectPorcupineLocalization/git/trees/5d33d345f2df166bc4c56cc9307a61a5ee57d346"
},
和父母:
"parents": [
{
"sha": "8b9b43e813645c3a66911247b3dca916af937738",
"url": "https://api.github.com/repos/QuiZr/ProjectPorcupineLocalization/commits/8b9b43e813645c3a66911247b3dca916af937738",
"html_url": "https://github.com/QuiZr/ProjectPorcupineLocalization/commit/8b9b43e813645c3a66911247b3dca916af937738"
}
]
我只想要第一个sha。不是其他的。
答案 0 :(得分:5)
在这种情况下,您可以非常轻松地使用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不存在,则为提交和反序列化创建模型类型这将是一个非常好的解决方案。
答案 1 :(得分:0)
如果您确实不想要新类型,可以使用匿名类型对其进行反序列化。 http://www.newtonsoft.com/json/help/html/DeserializeAnonymousType.htm