JSON.stringify, измените регистр ключа

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

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

Корпус подобен этому, поскольку он совпадает с именами свойств из класса .net в соответствии с нашим соглашением об именах.

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

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

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

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

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

Спасибо.

Ответы

Ответ 1

Вы можете использовать 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.

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