如何使用JSON.Net读取JSON并输出HTML?

如何使用JSON.Net并循环使用以下JSON为“photos”对象的每个成员输出一个HTML图像标记(字符串)?

我的目标是阅读以下JSON并输出以下字符串:

"Hello World!Another Photo" 

JSON存储在外部文件“photos.json”中

 { "photos": { "photo1": { "src": "https://stackoverflow.com/images/foo.jpg", "alt": "Hello World!" }, "photo2": { "src": "https://stackoverflow.com/images/bar.jpg", "alt": "Another Photo" } } } 

我开始使用类似于此处所示的代码: http : //www.hanselman.com/blog/NuGetPackageOfTheWeek4DeserializingJSONWithJsonNET.aspx

 var client = new WebClient(); client.Headers.Add("User-Agent", "Nobody"); var response = client.DownloadString(new Uri("http://www.example.com/photos.json")); JObject o = JObject.Parse(response);' //Now o is an object I can walk around... 

但是,我没有找到一种方法来“走动o”,如示例所示。

我想遍历照片对象的每个成员,阅读属性并为每张照片添加html到我的字符串。

到目前为止,我已经尝试过这里显示的示例: http : //james.newtonking.com/json/help/index.html?topic = html / QueryJson.htm但是,我无法让它们在每个循环中运行一次。

以下是如何“遍历”您的JObject以提取所需信息的方法。

 string json = @" { ""photos"": { ""photo1"": { ""src"": ""https://stackoverflow.com/images/foo.jpg"", ""alt"": ""Hello World!"" }, ""photo2"": { ""src"": ""https://stackoverflow.com/images/bar.jpg"", ""alt"": ""Another Photo"" } } }"; StringBuilder sb = new StringBuilder(); JObject o = JObject.Parse(json); foreach (JProperty prop in o["photos"].Children()) { JObject photo = (JObject)prop.Value; sb.AppendFormat("{1}\r\n", photo["src"], photo["alt"]); } Console.WriteLine(sb.ToString()); 

输出:

 Hello World! Another Photo 

首先,您需要定义一个包含数据的类,并且还能够将自己输出为HTML标记:

 public class Photo { public string Src { get; set; } public string Alt { get; set; } public string ToHtml() { return string.Format( "{1}, this.Src, this.Alt); } } 

为了能够使用JSON.Net创建类型化对象,您需要“规范化”您的JSON – 它并不完全采用通常的格式来指示相同对象的数组。 你必须完全摆脱标识符photo*1*, photo*2*,.., photo*n* ,或者你必须使它们相同(即它们都应该只是photo ,没有数字)。 如果您可以控制JSON创建,那么您可以在那里完成。 否则,您必须相应地操作Web响应(例如,使用string.Replace(...) )。

完成后,您可以使用JSON.Net获取类型列表,然后您可以简单地遍历它以获取所需的HTML:

 var client = new WebClient(); client.Headers.Add("User-Agent", "Nobody"); string response = client.DownloadString(new Uri("http://www.example.com/photos.json")); // --> 'Normalize' response string here, if necessary List photos = JsonConvert.DeserializeObject>(response); // now buid the HTML string var sb = new StringBuilder(); foreach(photo in photos) { sb.Append(photo.ToHtml()); } string fullHtml = sb.ToString(); ...