从JSON解析和提取属性

我有一个类似于这个的大型JSON文件:

{ "data":[ { "attribution":null, "tags":[ "thenight2" ], "type":"image", "images":{ "standard_resolution":{ "url":"http://distilleryimage3.s3.amazonaws.com/59d6984092a211e392db12e25f465f4f_8.jpg", "width":640, "height":640 } } }, { "attribution":null, "tags":[ "thenight2" ], "type":"image", "images":{ "low_resolution":{ "url":"http://distilleryimage1.s3.amazonaws.com/c179b34a91ff11e3b99c0aa73e1070c5_6.jpg", "width":306, "height":306 }, "thumbnail":{ "url":"http://distilleryimage1.s3.amazonaws.com/c179b34a91ff11e3b99c0aa73e1070c5_5.jpg", "width":150, "height":150 }, "standard_resolution":{ "url":"http://distilleryimage1.s3.amazonaws.com/c179b34a91ff11e3b99c0aa73e1070c5_8.jpg", "width":640, "height":640 } }, "users_in_photo":[ ] } ] } 

我想从JSON中所有图像的standard_resolution属性中提取所有url属性值的列表。 怎么做到呢?

我以前在System.Web.Helpers命名空间(.Net 4.0)中使用过JSON类,它对我很有用。 您可以动态引用数组。 它应该与此类似地使用:

 dynamic myJson = Json.Decode(myJsonString); foreach (var url in myJson.data.images.standard_resolution){ //DO SOMETHING } 

您可以使用JSON.net的Linqfunction以及select token方法来获取您要查找的数据:

 String fileContents = System.IO.File.ReadAllText("Z:\\temp\\test.json"); Newtonsoft.Json.Linq.JObject obj = Newtonsoft.Json.Linq.JObject.Parse(fileContents); IList urls = obj["data"].Select(m => (string)m.SelectToken("images.standard_resolution.url")).ToList(); 

添加参考

 using System.IO; using System.Text; using System.Runtime.Serialization.Json; 

使用JSON创建一个字符串变量

 string json = "{\"data\":[{\"attribution\":null,\"tags\":[\"thenight2\"],\"type\":\"image\",\"images\":{\"standard_resolution\":{\"url\":\"http://distilleryimage3.s3.amazonaws.com/59d6984092a211e392db12e25f465f4f_8.jpg\","+ "\"width\":640,\"height\":640}}},{\"attribution\":null,\"tags\":[\"thenight2\"],\"type\":\"image\",\"images\":{\"low_resolution\":{"+ "\"url\":\"http://distilleryimage1.s3.amazonaws.com/c179b34a91ff11e3b99c0aa73e1070c5_6.jpg\",\"width\":306,\"height\":306},\"thumbnail\":{\"url\":\"http://distilleryimage1.s3.amazonaws.com/c179b34a91ff11e3b99c0aa73e1070c5_5.jpg\","+ "\"width\":150,\"height\":150},\"standard_resolution\":{ \"url\":\"http://distilleryimage1.s3.amazonaws.com/c179b34a91ff11e3b99c0aa73e1070c5_8.jpg\",\"width\":640,\"height\":640"+ "}},\"users_in_photo\":[]} ]}"; 

在发生转换的类中创建一个方法。

 public static T Deserialize(string json) where T : new() { using (MemoryStream memoryStream = new MemoryStream(Encoding.Unicode.GetBytes(json))) { var serializer = new DataContractJsonSerializer(typeof(T)); return (T)serializer.ReadObject(memoryStream); } } 

在具有转换的类下面添加这些类

 public class Data { public Users[] users { get; set; } } public class Users { public Image image { get; set; } } public class Image { public StandardUrl standardUrl { get; set; } } public class StandardUrl { public string url { get; set; } } 

将此代码放在需要转换的位置

 var dataObj = Deserialize>(json); 

使用foreach循环遍历变量dataObj。

示例使用Windows Phone 7解析包含数组的JSON对象