JSON.stringify, измените регистр ключа - PullRequest
18 голосов
/ 30 марта 2011

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

var entry = {
  "FirstName": "John",
  "LastName": "Doe",
  ....
};

Оболочка похожа на это, потому что она соответствует именам свойств из класса .net в соответствии с нашим соглашением об именах.

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

var entry = {
  "firstName": "John",
  "lastName": "Doe",
  ....
};

Это, конечно, не работает.

Я использую JSON.stringify для отправки json обратно в веб-сервис в виде строки, и я искал, есть ли простой способ изменить ключк верблюжьему делу.Однако, похоже, что я могу использовать параметр замены только для работы со значением.

Я мог бы изменить сериализацию класса, но давайте притворимся, что это не вариант.Есть идеи?

Спасибо.

1 Ответ

31 голосов
/ 30 марта 2011

Вы можете использовать заменитель JSON для переключения клавиш перед записью.

JSON.stringify(myVal, function (key, value) {
  if (value && typeof value === 'object') {
    var replacement = {};
    for (var k in value) {
      if (Object.hasOwnProperty.call(value, k)) {
        replacement[k && k.charAt(0).toLowerCase() + k.substring(1)] = value[k];
      }
    }
    return replacement;
  }
  return value;
});

Для обратного вы можете использовать JSON reviver.

JSON.parse(text, function (key, value) {
    if (value && typeof value === 'object')
      for (var k in value) {
        if (/^[A-Z]/.test(k) && Object.hasOwnProperty.call(value, k)) {
          value[k.charAt(0).toLowerCase() + k.substring(1)] = value[k];
          delete value[k];
        }
      }
      return value;
    });

Второй необязательный аргумент - это функция, которая вызывается с каждым значением, созданным как часть синтаксического анализа, или каждым значением, которое должно быть записано. Эти реализации просто перебирают ключи и строчные буквы по первой букве любой буквы, которая имеет заглавную букву.

Документация для заменителей и ревизоров приведена по адресу http://json.org/js.html:

Необязательный параметр reviver - это функция, которая будет вызываться для каждого ключа и значения на каждом уровне конечного результата. Каждое значение будет заменено результатом функции reviver. Это можно использовать для преобразования общих объектов в экземпляры псевдоклассов или для преобразования строк даты в объекты Date.

Метод stringifier может принимать дополнительную функцию заменителя. Он будет вызываться после метода toJSON (если он есть) для каждого из значений в структуре. Каждому ключу и значению будут переданы параметры, и это будет привязано к объекту, удерживающему ключ. Возвращаемое значение будет строковым.

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