Leyendo datos JSON a la cadena C #

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

Pregunta

Estoy trabajando en un proyecto de la aplicación C # Console y me han pedido que analice algunos datos JSON de una página web y extraiga ciertos valores de JSON, como el precio y el color del producto.

Mis datos JSON, extraídos de una página web utilizando HTMLAgilityPack. Tuve que reemplazar \" con " para que sea JSON válido, otra pregunta, ¿cómo puede C # manejar esto correctamente?

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

Ahora, el JSON anterior es correcto por lo que sé, pero no puedo leer los datos porque C # no permite " y si uso \" mi JArray no puede deserializar el objeto.

Soy nuevo en JSON en C #, estoy usando la biblioteca JSON.NET, mi objetivo final es descifrar el JSON, por lo que puedo recuperar los datos a una cadena de C # para su uso posterior. Pero estoy atascado en cuanto a cómo puedo hacer esto.

¡Agradeciendotelo de antemano!

Más información según lo solicitado.

Mi código para raspar los datos JSON de JavaScript está aquí.

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 página web de la que llevo el 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

Respuesta popular

Creo que el problema aquí es que su código de raspado de javascript está eliminando el corsé final de los datos, lo que evita que JSON.net lo analice correctamente como JSON. Tu tienes esto:

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

Pero debería ser esto:

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

Una vez que tenga una cadena JSON correcta, puede deserializarla de esta manera:

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

Desde allí puede usar la API LINQ-to-JSON de Json.Net para obtener los datos que desea de JToken . La documentación tiene código de ejemplo que muestra cómo consultar valores específicos.



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow