2013-12-18 26 views
3

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

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

"<img src='/images/foo.jpg' alt='Hello World!'><img src='/images/bar.jpg' alt='Another Photo' />" 

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

{ 
    "photos": { 
     "photo1": { 
      "src": "/images/foo.jpg", 
      "alt": "Hello World!" 
     }, 
     "photo2": { 
      "src": "/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... 

但是,我还没有找到一个方法来“绕走Ò”作为表演在这个例子中。

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

到目前为止,我已经尝试过这里显示的示例:http://james.newtonking.com/json/help/index.html?topic=html/QueryJson.htm 但是,我不能让它们在每个循环内部都有工作。

回答

7

这里是你如何可以“走动”你的JObject来提取你需要的信息。

string json = @" 
{ 
    ""photos"": { 
     ""photo1"": { 
      ""src"": ""/images/foo.jpg"", 
      ""alt"": ""Hello World!"" 
     }, 
     ""photo2"": { 
      ""src"": ""/images/bar.jpg"", 
      ""alt"": ""Another Photo"" 
     } 
    } 
}"; 

StringBuilder sb = new StringBuilder(); 
JObject o = JObject.Parse(json); 

foreach (JProperty prop in o["photos"].Children<JProperty>()) 
{ 
    JObject photo = (JObject)prop.Value; 
    sb.AppendFormat("<img src='{0}' alt='{1}' />\r\n", 
        photo["src"], photo["alt"]); 
} 

Console.WriteLine(sb.ToString()); 

输出:

<img src='/images/foo.jpg' alt='Hello World!' /> 
<img src='/images/bar.jpg' alt='Another Photo' /> 
2

首先,你需要定义包含您的数据的类,并且还能够输出本身的HTML标签:

public class Photo 
{ 
    public string Src { get; set; } 
    public string Alt { get; set; } 

    public string ToHtml() 
    { 
     return string.Format(
      "<img src='{0}' alt='{1}'/>, 
      this.Src, 
      this.Alt); 
    } 
} 

为了能够使用JSON.Net创建类型对象,你需要对你的JSON进行“规范化” - 它不完全采用通常的格式来表示一组相同的对象。你必须完全摆脱标识符photo*1*, photo*2*,.., photo*n*,或者你必须使它们相同(即它们都应该简单地为photo,不包括数字)。如果你可以控制JSON的创建,你可以在那里做。否则,您必须相应地操作网络响应(例如,使用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<Photo> photos = JsonConvert.DeserializeObject<List<Photo>>(response); 

// now buid the HTML string 
var sb = new StringBuilder(); 
foreach(photo in photos) 
{ 
    sb.Append(photo.ToHtml()); 
} 
string fullHtml = sb.ToString(); 
... 
+0

谢谢托马斯!我不确定哪种方法更好,但我最终使用了Brian Rogers的方法。 – edt

相关问题