我正在处理一个 C# 控制台应用项目,我被要求从网页中解析一些 JSON 数据,并从 JSON 中提取某些值,例如产品价格和颜色。
我的JSON数据,使用HTMLAgilityPack从网页中提取。我不得不用"
替换"
以使其成为有效的 JSON,另一个问题,C# 如何正确处理这个问题?
{
"currentAsinData": {
"Asin": "B0013NCYX4",
"buyingPPU": "",
"variantImages": [
{
"tinyImage": {
"HEIGHT": "70",
"URL": "http: //ecx.images-amazon.com/images/I/419CBUN6h8L._SL110_.jpg",
"WIDTH": "110"
},
"swatchImage": {
"HEIGHT": "19",
"URL": "http: //ecx.images-amazon.com/images/I/419CBUN6h8L._SL30_.jpg",
"WIDTH": "30"
},
"mediumImage": {
"HEIGHT": "168",
"URL": "http: //ecx.images-amazon.com/images/I/419CBUN6h8L._SX168_.jpg",
"WIDTH": "168"
},
"largeImage": {
"HEIGHT": "270",
"URL": "http: //ecx.images-amazon.com/images/I/419CBUN6h8L._SX270_.jpg",
"WIDTH": "270"
},
"thumbnailImage": {
"HEIGHT": "120",
"URL": "http: //ecx.images-amazon.com/images/I/419CBUN6h8L._SX120_.jpg",
"WIDTH": "120"
}
}
]
}
}
现在,据我所知,上述 JSON 是正确的,但我无法读取数据,因为 C# 不允许"
,如果我使用"
,我的JArray
无法反序列化对象。
我是 C# 中 JSON 的新手,我正在使用 JSON.NET 库,我的最终目标是希望破译 JSON,这样我就可以将数据检索到 C# 字符串以供进一步使用。但是我被困在如何做到这一点上。
提前感谢你!
更多信息请按要求提供。
我抓取javascript JSON数据的代码在这里。
string theScript = xd.SelectSingleNode(".//div[contains(@class,'webstore-ProductJSONData')]/script[contains(.,'var detailData')]").GetInnerXML().HtmlDecode();
if(theScript != null)
{
string[] varsln = Regex.Split(theScript, "var detailData =");
string json = varsln[1].HtmlDecode().Replace("};nvar extensibilityData = {};nrn//]]>//", "").Trim();
Console.WriteLine(json);
}
我从中获取 JSON 的网页
http://www.dangleberrymusic.co.uk/Childrens-Childs-Electric-Guitar- quarter/dp/B00ESEOXWK?class=quickView&field_availability=-1&field_browse=1592919031&id=Childrens+Childs+Electric+Guitar+quarter&ie=UTF8&refinementHistory=color_map%2Cbrandtextbin%2Csubjectbin%2Cprice%2Csize_name&searchNodeID=1592919031&searchPage=1&searchRank=salesrank&searchSize=12
您可以将json 建模为对象,然后使用 json.Net 对其进行反序列化。
AsinData ad = JsonConvert.DeserializeObject<AsinData>(json)
我认为这里的问题是您的javascript抓取代码正在从数据中删除尾随大括号,从而阻止 JSON.net 将其正确解析为JSON。 你有这个:
.Replace("};nvar extensibilityData = {};nrn//]]>//", "")
但它应该是这样的:
.Replace(";nvar extensibilityData = {};nrn//]]>//", "")
获得正确的 JSON 字符串后,您可以像这样反序列化它:
JToken token = JToken.Parse(json); // works with either objects or arrays
从那里,您可以使用 Json.Net 的 LINQ-to-JSON API 从JToken
获取所需的数据。 该文档包含演示如何查询特定值的示例代码。