Перетворення рядка в об'єкт JSON


148

Як змусити JS думати, що рядок - JSON?

У мене є функція, яка працює лише в тому випадку, якщо до неї передано об'єкт JSON. Якщо я передаю йому рядок у такому ж форматі, як і JSON, вона не працює. Тому я хочу, щоб ця функція подумала, що передана їй рядок є JSON. Рядок дійсно у форматі JSON.

Я також спробував наступне. Я ввів рядок через Ajax, з параметром "обробляти як", як "JSON", а потім, коли я передав результат функції, яка працює.

Тому я вивів, що проблема не в рядку. Як перетворити цей рядок у JSON? Якщо я отримую ту саму рядок через ajax-запит, а потім передаю її у функцію, працює, тоді як безпосередньо передача не працює.

Рядок такий:

  {
     "data": [
   {
  "id": "id1",
      "fields": [
        {
          "id": "name1",
          "label": "joker",
          "unit": "year"
        },
         {"id": "name2", "label": "Quantity"},
    ],
      "rows": [    data here....

and closing braces..


2
Ваша назва вводить в оману. Виходячи зі змісту вашого запитання, я б сказала, що ви хочете перетворити рядок, що містить JSON, в об’єкт / масив JavaScript.
Фелікс Клінг

Гаразд я вирішив це. У рядку було \ n Тепер залишається лише з'ясувати, як використовувати JSON.parse для цього.
Zer0

Гаразд, я це виправив. Перейдіть на jsonlint.com і покладіть туди свою рядок. Якщо він каже правильно, тоді ви можете використовувати JSONParse для досягнення того ж.
Zer0

Якщо хтось прочитає це, заголовок повинен бути "перетворенням рядка JSON в об'єкт"
Кріс Г

Відповіді:


353
var obj = JSON.parse(string);

Де stringтвій рядок json


Це не працює. Це кидання помилки "SyntaxError: JSON.parse: несподіваний символ". У рядку немає нічого поганого, як коли я отримую ту саму рядок через запит ajax і обробляю її як "JSON", жодних проблем не виникає.
Zer0

будь ласка, опублікуйте свою акустичну струну JSON
Kshitij

{"data": [{id ": - тут вам не вистачає подвійної цитати, тобто починаючи подвійну цитату id
Kshitij

2
Коли я отримую це через Ajax, він працює, як тоді він обробляє відповідь як JSON. Тому я думаю, що мені доведеться перетворити це на об’єкт JSON ..
Zer0,

2
Я перейшов на jsonlint.com і переконався, що мій Джсон правильний
Zer0,

26

Ви можете використовувати JSON.parse()для цього.

Дивіться документи в MDN

Приклад:

var myObj = JSON.parse('{"p": 5}');
console.log(myObj);

1
Це не працює. Це кидання помилки "SyntaxError: JSON.parse: несподіваний символ". У рядку немає нічого поганого, як коли я отримую ту саму рядок через запит ajax і обробляю її як "JSON", жодних проблем не виникає.
Zer0

2
@ Zer0: Вам слід оновити своє запитання про те, як ви його намагаєтеся, разом із рядком json.
Сарфраз

4
@ Zer0: Ми можемо відповідати лише наскільки нам відомо. Ви кажете, що у вас є рядок JSON, ми відповідаємо відповідно. Здається, ваш рядок відрізняється, якщо ви опублікуєте його, ми можемо відповісти, враховуючи це. Якщо ви задаєте питання щодо кодування, то код / ​​дані є незамінними.
Фелікс Клінг

7

У мене була така ж проблема з подібною струною, як у вас

{id:1,field1:"someField"},{id:2,field1:"someOtherField"}

Проблема тут - структура струни. Аналізатор json не визнавав, що в цьому випадку потрібно створити 2 об'єкти. Тож те, що я зробив, виглядає нерозумно, я просто переструктурував свою рядок і додав до []цього розпізнаваний парсер

var myString = {id:1,field1:"someField"},{id:2,field1:"someOtherField"}
myString = '[' + myString +']'
var json = $.parseJSON(myString)

Сподіваюся, це допоможе,

Якщо хтось має більш елегантний підхід, будь ласка, поділіться.


У своєму коді вище ви myStringнеправильно побудували . Це не рядок, і він неправильно відформатований JSON. Потім ваш другий рядок стане зайвим. Ось що це повинно бути: var myString = '[{"id":1,"field1":"someField"},{"id":2,"field1":"someOtherField"}]' я знаю, що це досить старий пост, але я подумав, що я додаю ясності, якщо хтось знайде його.
Джеймс Еберхардт

Я вирішив свою проблему, використовуючи те, $.parseJSONде JSON.parseне працював, і кинув помилкуJSON.parse is not a function
brasofilo


3

конвертувати рядок у HashMap за допомогою Object Mapper ...

new ObjectMapper().readValue(string, Map.class);

Внутрішня карта буде вести себе як об'єкт JSON


2
var Data=[{"id": "name2", "label": "Quantity"}]

Передайте змінну рядка в Json розбір:

Objdata= Json.parse(Data);

У вашому прикладі Dataце вже об’єкт, тому не було б необхідності розбирати його. Вам потрібні цитати, що оточують усі ваші Дані, щоб зробити його рядком.
Джеймс Еберхардт

2

Просто використовуйте evalфункцію.

var myJson = eval(theJsibStr);

eval - це зло, будьте дуже обережні до безпеки з таким підходом
dparker

0

JSON.parse() функція буде виконувати.

або

Використовуючи Jquery,

var obj = jQuery.parseJSON( '{ "name": "Vinod" }' );
alert( obj.name === "Vinod" );

0

Давайте розглянемо, що у вас є подібний рядок

приклад: "ім'я: люсі, вік: 21, стать: жінка"

function getJsonData(query){
    let arrayOfKeyValues = query.split(',');
    let modifiedArray =  new Array();
    console.log(arrayOfKeyValues);
    for(let i=0;i< arrayOfKeyValues.length;i++){
        let arrayValues = arrayOfKeyValues[i].split(':');
        let arrayString ='"'+arrayValues[0]+'"'+':'+'"'+arrayValues[1]+'"';
        modifiedArray.push(arrayString);
    }
    let jsonDataString = '{'+modifiedArray.toString()+'}';
    let jsonData = JSON.parse(jsonDataString);
    console.log(jsonData);
    console.log(typeof jsonData);
    return jsonData;
}

let query = "name:lucy,age:21,gender:female";
let response = getJsonData(query);
console.log(response);

`

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.