1

嗨,这是我想要在我的应用程序中解析图像的 Json 链接

http://collectionking.com/rest/view/items_in_collection.json?args=122

问题在于,在解析它时会解析文本,即标题和 nid 而不是图片。任何人都可以帮助如何解析其中包含空格的对象.. 即在我的 json 中有一个名为(主图像)的图像。这是主要问题。这是我解析 Json 的代码

using (var wc = new WebClient()) {
    JavaScriptSerializer js = new JavaScriptSerializer();
    var result = js.Deserialize<ck[]>(wc.DownloadString("http://collectionking.com/rest/node/122.json"));
    foreach (var i in result)
    {
        lblTitle.Text = i.node_title;
        lblNid.Text = i.nid;
        imgCk.ImageUrl = i.main_image;
    }

提前致谢

4

2 回答 2

2

这是我的新答案。

使用JavaScriptSerializer传入的 JSON 时会出现问题,如下所示:

[
   {
      "node_title":"<a href=\"/item/brickell-point\">Brickell Point</a>",
      "main image":"<img typeof=\"foaf:Image\" src=\"http://collectionking.com/sites/default/files/styles/collection_list/public/BrickellPoint_front.jpg\" width=\"200\" height=\"250\" alt=\"\" />",
      "nid":"123"
   },
   {
      "node_title":"<a href=\"/item/flagler-street-bridge\">Flagler Street Bridge</a>",
      "main image":"<img typeof=\"foaf:Image\" src=\"http://collectionking.com/sites/default/files/styles/collection_list/public/FlaglerStreetBridge_Miami_River.Front_.jpg\" width=\"200\" height=\"250\" alt=\"\" />",
      "nid":"124"
   }
]

并且有一个带有空格的图像属性......这是无法完成的,所以让我们为此使用JSON.NET

第 1 步- 右键单击References​​您的项目并选择Manage Nuget Packages并在“在线”选项卡中安装 JSON.NET

之后,使用以下代码:

// grab information
using (var wc = new WebClient()) {
    json = wc.DownloadString(url);
}

// deserialize using JSON.NET
var result = Newtonsoft.Json.JsonConvert.DeserializeObject<ck[]>(json);

// output
foreach (var i in result)
{
    lblTitle.Text = i.node_title;
    lblNid.Text = i.nid;
    imgCk.ImageUrl = i.main_image;}
}

记住将您的ck对象修改为

public class ck
{
    public string node_title { get; set; }
    public string nid { get; set; }

    [Newtonsoft.Json.JsonProperty(PropertyName = "main image")]
    public string main_image { get; set; }
}

我们使用JsonProperty映射我们收到的正确属性。

为了从标签中提取标题和图像,因为我不喜欢 RegEx,我使用:

private static string ExtractImageFromTag(string tag)
{
    int start = tag.IndexOf("src=\""),
        end = tag.IndexOf("\"", start + 6);
    return tag.Substring(start + 5, end - start - 5);
}
private static string ExtractTitleFromTag(string tag)
{
    int start = tag.IndexOf(">"),
        end = tag.IndexOf("<", start + 1);
    return tag.Substring(start + 1, end - start - 1);
}

所以你可以自己使用它:

// output
foreach (var i in result)
{
    // for this example, let's grab the last 
    lblTitle.Text= ExtractTitleFromTag(i.node_title);
    lblNid.Text= i.nid;
    imgCk.ImageUrl= ExtractImageFromTag(i.main_image);
}

现在......您确实意识到foreach只会获得接收 JSON 的最后一个条目吗?因为你不是

你应该简单地做:

foreach (var i in result)
{
    i.node_title = ExtractTitleFromTag(i.node_title);
    i.main_image = ExtractImageFromTag(i.main_image);
}

例如,使用 DataGrid 显示的不仅仅是一个条目。

myDataGrid.Source = ck;
于 2012-12-22T11:31:36.853 回答
1

main_image属性不包含图像 URL。相反,它包含一段 HTML,例如:

<img typeof="foaf:Image" src="http://collectionking.com/sites/default/files/styles/collection_list/public/FlaglerStreetBridge_Miami_River.Front_.jpg" width="200" height="250" alt="" />

您可以使用正则表达式来提取 URL(这不是万无一失的,但在大多数情况下可能会起作用):

string imageUrl = null;
string htmlPiece = i.main_image;
Match m = Regex.Match(htmlPiece, "src=\"[^\"]+\"");
if (m.Success)
  imageUrl = m.Value.Substring(5, m.Value.Length - 6);
于 2012-12-22T10:44:04.647 回答