Как разобрать JSON, внутри которого есть вложенный экранированный JSON, в javascript?

Обновление: этот JSON — лишь один из примеров, мне нужно прочитать эти файлы JSON и передать их функции, которая принимает JSONObject.

У меня есть такой JSON -

    {   "log": {
    "version": "1.2",
    "entries": [
      {
        "response": {
          "status": 200,
          "statusText": "OK",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Date",
              "value": "Tue, 19 Feb 2019 13:50:34 GMT"
            },
            {
              "name": "CF-RAY",
              "value": "4ab934095ceacc4c-ZRH"
            },
            {
              "name": "Content-Encoding",
              "value": "gzip"
            }
          ],
          "cookies": [],
          "content": {
            "size": 155,
            "mimeType": "application/json",
            "compression": 0,
            "text": "{\"ip\":\"45.64.195.115\",\"ip_decimal\":759219059,\"country\":\"India\",\"country_eu\":false,\"country_iso\":\"IN\",\"city\":\"nocity\",\"latitude\":98.975,\"longitude\":92.8258}"
          },
          "redirectURL": "",
          "headersSize": 230,
          "bodySize": 155,
          "_transferSize": 385
        },
        "cache": {},
        "timings": {
          "blocked": 6.805000007039867,
          "dns": -1,
          "ssl": -1,
          "connect": -1,
          "send": 0.22000000000000064,
          "wait": 174.87700000413787,
          "receive": 11.549999995622784,
          "_blocked_queueing": 0.8590000070398673
        },
        "serverIPAddress": "100.28.12.103",
        "_initiator": {
          "type": "other"
        },
        "_priority": "VeryHigh",
        "connection": "509100",
        "pageref": "page_2"
      }
    ]   
  } 
}

И я пытаюсь разобрать, используя -

var parsed = JSON.parse(myJson);

это выдает ошибку в этой части - "text": "{\"ip\":\"49.64.194.115\",\"ip_decimal\":75

потому что это экранированный вложенный JSON.

Как это сделать? Я нашел один метод здесь, но он не подходит для этой проблемы.

То, что вы опубликовали, - это не JSON, а простой объект JS. Таким образом, вы можете получить прямой доступ к text и проанализировать только это

Thomas 26.02.2019 16:56

Когда вы публикуете вопрос, пожалуйста, вернитесь и проголосуйте за любые правильные/полезные ответы.

Duncan 04.03.2019 17:43

Я сделал на самом деле. В тот же день, когда я задал вопрос.

Darpan 05.03.2019 08:58
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
941
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Ваш json уже можно использовать как объект javascript

const myJSON = {
   "log":{
      "version":"1.2",
      "entries":[
         {
            "response":{
               "status":200,
               "statusText":"OK",
               "httpVersion":"HTTP/1.1",
               "headers":[
                  {
                     "name":"Date",
                     "value":"Tue, 19 Feb 2019 13:50:34 GMT"
                  },
                  {
                     "name":"CF-RAY",
                     "value":"4ab934095ceacc4c-ZRH"
                  },
                  {
                     "name":"Content-Encoding",
                     "value":"gzip"
                  }
               ],
               "cookies":[

               ],
               "content":{
                  "size":155,
                  "mimeType":"application/json",
                  "compression":0,
                  "text":"{\"ip\":\"45.64.195.115\",\"ip_decimal\":759219059,\"country\":\"India\",\"country_eu\":false,\"country_iso\":\"IN\",\"city\":\"nocity\",\"latitude\":98.975,\"longitude\":92.8258}"
               },
               "redirectURL":"",
               "headersSize":230,
               "bodySize":155,
               "_transferSize":385
            },
            "cache":{

            },
            "timings":{
               "blocked":6.805000007039867,
               "dns":-1,
               "ssl":-1,
               "connect":-1,
               "send":0.22000000000000064,
               "wait":174.87700000413787,
               "receive":11.549999995622784,
               "_blocked_queueing":0.8590000070398673
            },
            "serverIPAddress":"100.28.12.103",
            "_initiator":{
               "type":"other"
            },
            "_priority":"VeryHigh",
            "connection":"509100",
            "pageref":"page_2"
         }
      ]
   }
}

Если вы хотите разобрать «log.entries.response.content.text», вы можете сделать что-то вроде этого

if (myJSON.log && myJSON.log.entries && myJSON.log.entries.length > 0) {
  for (const element of myJSON.log.entries) {
    if (element.response && element.response.content && element.response.content.text) {
      try {
        element.response.content.text = JSON.parse(element.response.content.text);
      } catch (error) {
        console.info('do nothing')
      }
    }
  }
}

Удивительно, но этот совет работает. Вместо разбора я передал это непосредственно в функцию. Позвольте мне попробовать еще несколько примеров.

Darpan 26.02.2019 17:23

это потому что

myJson.log.entries[0].response.content.text

после JSON stringify, поэтому вам нужно сначала проанализировать его, а после этого проанализировать весь объект.
так что сделайте это:

myJson.log.entries[0].response.content.text = JSON.parse(myJson.log.entries[0].response.content.text);

Очень просто: вам просто нужно знать, когда у вас есть объект javascript, а когда у вас есть строка, представляющая объект javascript в формате JSON.

В приведенном вами примере ваш внешний объект выглядит как объект javascript, а не как строка JSON. Так что вам не нужно его анализировать, вы можете просто манипулировать им. Внутри него встроен элемент с именем «текст», который представляет собой строку JSON. Вы можете получить доступ к текстовому элементу, а затем выполнить синтаксический анализ с помощью JSON.parse. Вот пример (в котором я вырезал большую часть постороннего контента в вашем объекте верхнего уровня):

const myObj = {"log": {
        "version": "1.2",
        "entries": [
            {
                "content": {
                    "size": 155,
                    "mimeType": "application/json",
                    "compression": 0,
                    "text": "{\"ip\":\"45.64.195.115\",\"ip_decimal\":759219059,\"country\":\"India\",\"country_eu\":false,\"country_iso\":\"IN\",\"city\":\"nocity\",\"latitude\":98.975,\"longitude\":92.8258}"
                }
            }
        ]
    }
};

const anotherObj = JSON.parse(myObj.log.entries[0].content.text);

console.info(JSON.stringify(anotherObj, null, 3));

Это приведет к следующему результату:

{
   "ip": "45.64.195.115",
   "ip_decimal": 759219059,
   "country": "India",
   "country_eu": false,
   "country_iso": "IN",
   "city": "nocity",
   "latitude": 98.975,
   "longitude": 92.8258
}

Другие вопросы по теме