Ключ JSON называется «истина» и не может ссылаться в JavaScript (пример JSfiddle) - PullRequest
1 голос
/ 14 апреля 2011

Прежде всего, я преобразовал Plist (в формате XML) в JSON с помощью некоторого онлайн-инструмента, это не проблема.Мне удалось выбрать важные значения из этого довольно большого файла JSON.С помощью этой важной информации я перестраиваю новый файл JSON, который очень компактен и содержит информацию, которую я могу использовать для плагина - который я создам позже.

Преобразование plist в JSON ужасно.В какой-то момент <true/> и <false/> преобразуются в JSON, оставляя это в JSON: "false":"", или "true":"",.

Я использую jQuery

проверьте JSfiddle для примера jsfiddle пример

или здесь

// Simplified (not really a JSON file, but this will do it for explaining) 
var themeJSON = {
    "item": {
        "false": "",
    },
};

// I need to know if its enabled: "true" or disabled: "false"

// function for checking if this is the default option
function checkDefault() {
    // true is a keyword!
    if (themeJSON.item.true) {
        return "1";
    // so is false!
    } else(themeJSON.item.false) {
        return "0";
    }
}

Может быть, я использую какую-то другую функцию, такую ​​как find ()?

обновлено для ответа: спасибо за комментарии, вот что у меня сейчас:

function checkDefault() {
    if (item.hasOwnProperty("true")) {
        return "1";
    } else if(item.hasOwnProperty("false")) {
        return "0";
    }
}

Ответы [ 4 ]

2 голосов
/ 14 апреля 2011

Попробуйте использовать имя свойства в виде строки:

if (themeJSON.item['true']) {
  return '1';
}
else if (themeJSON.item['false']) {
    return "0";
}

изменить & mdash; комментарий правильно указывает, что, хотя доступ к свойствам по строковому значению действительно будет работать, ваш код в противном случае имеет недостатки. Если свойства действительно получают пустые строковые значения, то вам действительно нужен способ проверить, существует ли свойство вообще, а не (как этот код делает) просто проверить значение свойства :

if (typeof themeJSON.item['true'] !== 'undefined') { ... }

или, альтернативно:

if ('true' in themeJSON.item) { ... }

Явная проверка на равенство с пустой строкой тоже подойдет:

if (themeJSON.item['true'] === '') { ... }
1 голос
/ 14 апреля 2011

Когда свойство объекта имеет имя, которое является зарезервированным ключевым словом, для ссылки на него можно использовать нотацию индекса массива.

Способ проверки, есть ли у item свойство с именем false:

> themeJSON.item.hasOwnProperty("false");
true

Это не идеально, поскольку один объект может иметь как свойство false, так и свойство true.

0 голосов
/ 14 апреля 2011

Попробуйте этот код

function checkDefault() {
    // true is a keyword!
    if ("true" in themeJSON.item) {
        return "1";
    // so is false!
    } else if ("false" in themeJSON.item) {
        return "0";
    }
}
0 голосов
/ 14 апреля 2011

В JS foo.bar является эквивалентом foo['bar'].Поэтому:

if (themeJSON.item['true'] === "")

Обратите внимание на необходимость === как false == "", но false !== "".

Кроме того, я должен придираться.themeJSON больше не является JSON, поскольку это не строка - это просто еще один объект JavaScript.Ты не должен путать этих двоих.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...