C # Parse list de git commits usando json.net

He estado navegando por varios sitios web y los documentos de JSON.net pero no puedo encontrar una forma elegante de hacerlo.

El problema

Tengo que analizar una list de confirmaciones de GitHub desde una date determinada.

El file json de ejemplo que he estado usando para probar: file json de ejemplo

The json es solo una matriz grande (o vacía). El problema es que no necesito todos los datos, solo necesito el sha de cada commit. Sin embargo, si observas cada tipo en la matriz, hay varios shas.

Está la base sha:

"sha": "fde139ae1d8fcf82bb145bbc99ed41763202e28f", 

el tree sha:

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

y el padre sha (s):

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

Solo quiero el primer sha. no el otro shas.

Requisitos

  • Necesita usar JSON.net (no Ockokit)
  • Debe ser elegante
  • Necesita soportar el motor de juego de Unity (es decir, la versión de C # menor o igual a 2.0)
  • Realmente no quiero crear un nuevo tipo de object solo para esto.

En este caso, puede usar LINQ to JSON muy fácilmente: analizar el text como JArray y luego solicitar la propiedad sha de cada object:

 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); } } } 

Tenga en count que esto utiliza expresiones lambda que son de C # 3, pero eso debería estar bien en Unity: solo es compatible con CLR v2, pero con el framework .NET 3.5, creo.

Sin embargo, en el futuro no dejaría que preocupaciones como "Es solo una pequeña parte de la base de código" lo desanime al crear un tipo – si LINQ to JSON no existía, creando un tipo de model para la confirmación y deserialization de ese ser una solución perfectamente buena.

Si realmente no quieres un tipo nuevo, puedes deserializarlo usando types anónimos. http://www.newtonsoft.com/json/help/html/DeserializeAnonymousType.htm