Проблема с объектом JSON: Uncaught SyntaxError: неожиданный токен

avatar
Nate
7 апреля 2018 в 23:30
143
1
1

Я пытаюсь создать переменную, используя данные из файла JSON, хотя она продолжает отображаться как неопределенная. проверка показывает объект параметров со следующей ошибкой:

Цель этого кода – настроить продукт с помощью первого объекта JSON, а затем получить дополнительную информацию о параметрах продукта с помощью второго объекта JSON.

Код должен вывести заголовок

"cover-silk": ["150gsm-silk-cover"] 

который хранится во втором объекте JSON

Переменная childTitle должна = "150gsm"

productData = {
  "product": [{
    "name": "booklet",
    "section": [{
      "coverStock": {
        "cover-silk": ["150gsm-silk-cover"]
      }
    }]
  }]
}, {
  "section2": {
    "coverStock": [{
      "title": "Cover Stock",
      "options": [{
        "cover-silk": {
          "title": "Silk",
          "childOptions": {
            "150gsm-silk-cover": {
              "title": "150gsm"
            }
          }
        }
      }]
    }]
  }
};

var key = productData.product[0].section[0];
var keys = [];
for (var k in key) keys.push(k);

var len = keys.length;
for (var i = 0; i < len; i++) {

var option = productData.product[0].section[0][keys[i]];

  var secObj = (option);
  var secObjArray = [];
  for (var k2 in secObj) secObjArray.push(k2);

  var len2 = secObjArray.length;

  for (var j = 0; j < len2; j++) {

    var childTitle = productData.section2[keys[i]][0].options[0][secObjArray][j].title;
    console.log(childTitle);

  }
};
Источник
gaetanoM
7 апреля 2018 в 23:34
0

title является собственностью cover-silk: productData.section2.coverStock[0].options[0]['cover-silk'].title

charlietfl
7 апреля 2018 в 23:35
0

Где фактический код, который выдает ошибку? Потратьте несколько минут, чтобы прочитать минимальный воспроизводимый пример

Nate
8 апреля 2018 в 00:30
0

Спасибо за совет, я обновил код

Ответы (1)

avatar
Praveen Kumar Purushothaman
7 апреля 2018 в 23:34
3

Я внес много изменений. Вся структура была неправильной. Ознакомьтесь с комментариями ниже и рабочим фрагментом:

  1. Все индексы неверны.
  2. Исходный JSON был неправильным.
  3. Многое изменилось. Лучше использовать Diff.

Фрагмент

var productData = {
  "product": [{
    "name": "booklet",
    "section": [{
      "coverStock": {
        "cover-silk": ["200gsm-silk-cover", "250gsm-silk-cover"],
        "cover-gloss": ["300gsm-gloss-cover", "250gsm-gloss-cover"]
      }
    }],
    "section2": {
      "coverStock": [{
        "title": "Cover Stock",
        "options": [{
          "cover-silk": {
            "title": "Silk",
            "childOptions": {
              "150gsm-silk-cover": {
                "title": "150gsm"
              }
            }
          }
        }]
      }]
    }
  }]
};

var key = productData.product[0].section[0];
var keys = [];
for (var k in key)
  keys.push(k);
var len = keys.length;
for (var i = 0; i < len; i++) {
  var option = productData.product[0].section[0][keys[i]];
  var secObj = option;
  var secObjArray = [];
  for (var k2 in secObj)
    secObjArray.push(k2);
  var len2 = secObjArray.length;
  for (j = 0; j < len2; j++) {
    var childTitle = productData.product[0].section[0][keys[i]][secObjArray[j]][0];
    console.log(childTitle);
  }
}

Разница:

Если вам интересно, это Diff:

Diff

Nate
7 апреля 2018 в 23:39
0

Извините, я пропустил этот момент, пытаясь упростить код. Cover-silk является частью справочника [отредактированный вопрос]

Praveen Kumar Purushothaman
7 апреля 2018 в 23:41
0

@Nate Мой ответ остается прежним. Если вы хотите использовать свойство, имеющее - или некоторые специальные символы, используйте запись массива, а не запись через точку. Проверьте мой ответ.

Nate
7 апреля 2018 в 23:44
0

В моем фактическом коде используется запись массива: childTitle = productData.section2[keys[i]][0].options[0][secObjArray][j]; Похоже, что .options[0] вызывает ошибку

Praveen Kumar Purushothaman
7 апреля 2018 в 23:44
0

@Nate Не могли бы вы показать нам полный код и повторить ошибку, пожалуйста?

Praveen Kumar Purushothaman
7 апреля 2018 в 23:47
0

@Nate Вы можете отредактировать свой вопрос, чтобы добавить полный код. Пожалуйста, сделайте это. :) PS: я тоже из Великобритании. :)

Praveen Kumar Purushothaman
8 апреля 2018 в 00:07
0

Ключи @Nate определены неправильно. Нет productData.product! Проверьте это.

Praveen Kumar Purushothaman
8 апреля 2018 в 00:41
0

@Nate var option = productData.product[0].section[0][keys[i]]; показывает undefined. Также не определен тот момент времени, i. Нам лучше сесть вместе, чтобы решить этот вопрос. Можно ли сделать это завтра или сейчас?

Praveen Kumar Purushothaman
8 апреля 2018 в 00:45
0

@Nate Кроме того, в этой строке var childTitle = productData.section2[keys[i]][0].options[0][secObjArray][j]; нет productData.section2, как должно быть productData.product.section2.

Nate
8 апреля 2018 в 00:51
0

Я переместил var childTitle внутрь цикла for — допустил ошибки, пытаясь упростить код. productData.section2 — второй объект в productData.

Nate
8 апреля 2018 в 00:52
0

Очень ценю, что вы изучили это, я рад сделать все, что вы считаете лучшим, чтобы решить проблему.

Praveen Kumar Purushothaman
8 апреля 2018 в 00:54
0

@Nate Я нашел решение. Написание ответа. Пожалуйста, подождите.

Praveen Kumar Purushothaman
8 апреля 2018 в 01:05
0

@Nate Можете ли вы снова опубликовать правильный var product? Кажется, это неправильный JSON - проверьте, используя JSONLint.com

Praveen Kumar Purushothaman
8 апреля 2018 в 01:08
0

@Nate Я также обновил правильный JSON и код. Проверьте это. Пожалуйста, нажмите на кнопку с галочкой, чтобы принять мой ответ. Спасибо.

Nate
8 апреля 2018 в 01:32
0

Пожалуйста, простите меня за то, что я не совсем понятен в этом, я впервые использую переполнение стека. Я обновил вопрос. Спасибо за время, которое вы потратили, чтобы помочь мне в этом!

Praveen Kumar Purushothaman
8 апреля 2018 в 08:03
0

@Нейт Конечно. Не волнуйтесь. Надеюсь, вы довольны решением, которое я предоставил. :)