我一直在浏览各种网站和JSON.net文档,但我找不到一种优雅的方式来做到这一点.
我必须解析自某个日期以来的GitHub提交列表.
我一直用于测试的示例json文件:示例json文件
json只是一个大型(或空)阵列.问题是我不需要所有的数据,我只需要每个提交的sha.但是,如果查看数组中的每个类型,则会有多个shas.
有基础:
"sha": "fde139ae1d8fcf82bb145bbc99ed41763202e28f",
树沙:
"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" } ]
我只想要第一个沙.不是其他的.
需要使用JSON.net(不是Ockokit)
应该优雅
需要支持Unity游戏引擎(即C#版本小于或等于2.0)
我真的不想为此创建一个新的对象类型.
Jon Skeet.. 5
在这种情况下,您可以非常轻松地使用LINQ to JSON - 将文本解析为a 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); Listhashes = 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不存在,则为提交创建模型类型并反序列化为是一个非常好的解决方案.
在这种情况下,您可以非常轻松地使用LINQ to JSON - 将文本解析为a 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); Listhashes = 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不存在,则为提交创建模型类型并反序列化为是一个非常好的解决方案.