Lettura dei dati JSON nella stringa C #

c# html-agility-pack json json.net xml

Domanda

Sto lavorando a un progetto di app C # Console e mi è stato chiesto di analizzare alcuni dati JSON da una pagina Web e di prelevare determinati valori da JSON, come il prezzo e il colore del prodotto.

I miei dati JSON, estratti da una pagina Web utilizzando HTMLAgilityPack. Ho dovuto sostituire \" con " per renderlo JSON valido, un'altra domanda, come può C # gestirlo correttamente?

{
    "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"
                }
            }
        ]
    }
}

Ora, il JSON sopra riportato è corretto per quanto ne so, ma non sono in grado di leggere i dati poiché C # non consente " e se utilizzo \" mio JArray non riesce a deserializzare l'oggetto.

Sono nuovo di JSON in C #, sto usando la libreria JSON.NET, il mio obiettivo finale è, si spera, decifrare il JSON, così posso recuperare i dati in una stringa C # per ulteriore utilizzo. Ma sono bloccato su come posso farlo.

Ringraziandola in anticipo!

Maggiori informazioni come richiesto

Il mio codice per raschiare i dati JSON javascript è qui.

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 = {};\n\r\n//]]>//", "").Trim();

            Console.WriteLine(json);
        }

La pagina web da cui sto prendendo il 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

Risposta popolare

Penso che il problema qui sia che il tuo codice di javascript-scraping sta rimuovendo la parentesi graffa finale dai dati, che quindi gli impedisce di essere analizzato come JSON correttamente da JSON.net. Tu hai questo:

 .Replace("};\nvar extensibilityData = {};\n\r\n//]]>//", "")

Ma dovrebbe essere questo:

 .Replace(";\nvar extensibilityData = {};\n\r\n//]]>//", "")

Una volta ottenuta una stringa JSON corretta, è possibile deserializzare in questo modo:

JToken token = JToken.Parse(json);  // works with either objects or arrays

Da lì è possibile utilizzare l'API LINQ-to-JSON di Json.Net per ottenere i dati desiderati da JToken . La documentazione contiene un codice di esempio che mostra come eseguire una query per valori specifici.



Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché