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

3

如何使用JSON.Net并循环遍历以下JSON,以输出“photos”对象的每个成员的一个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"
        }
    }
}

我开始使用与这里展示的代码类似的代码:

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”的方法。
我想循环遍历每个photos对象成员,读取属性并为每个照片添加html字符串。
到目前为止,我尝试了这里显示的示例:http://james.newtonking.com/json/help/index.html?topic=html/QueryJson.htm,但是我无法在for each 循环内使它们起作用。
2个回答

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创建,您可以在那里正确执行此操作。否则,您必须相应地操作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<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();
...

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接