Прописные и строчные буквы - PullRequest
0 голосов
/ 28 июня 2018

У меня простая проблема.

У меня есть несколько способов получить JSON из других приложений, которые я не контролирую. Все клавиши имеют одинаковое имя, но некоторые прописные, а некоторые строчные.

Как мне прочитать JSON, чтобы не имело значения строчные или прописные буквы?

Например, в моем коде, когда json имеет customer_id в нижнем регистре, он не работает

HTML

 <td ng-repeat="customer in customers">{{customer.CUSTOMER_ID}}</td> // this only works when the JSON keys comes uppercase

Контроллер

// Get Customers
promises.customers.$promise.then(function (data) {
    $scope.customers = data["Customers"].Customers;

    if(!angular.isArray($scope.customers)) {
        $scope.customers = [$scope.customers];
    }
    console.log($scope.customers);
}.bind(this));

Ответы [ 4 ]

0 голосов
/ 28 июня 2018

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

например. Функция нормализации всех клавиш в нижнем регистре

function getParsedObjectWithUpperCaseKeys(jsonObject) {
    var parsedObjectWithUpperCaseKeys = {};

    Object.keys(jsonObject).forEach(function (jsonObjectKey) {
        parsedObjectWithUpperCaseKeys [jsonObjectKey.toUpperCase()] = jsonObject[jsonObjectKey];
    });

    return parsedObjectWithUpperCaseKeys;
}

А в вашем контроллере код:

// Get Customers
promises.customers.$promise.then(function (data) {
    var customers = data["Customers"].Customers;

    $scope.customers = getParsedObjectWithUpperCaseKeys(customers);

    if(!angular.isArray($scope.customers)) {
        $scope.customers = [getParsedObjectWithUpperCaseKeys(customers)];
    } else {
        $scope.customers = [getParsedObjectWithUpperCaseKeys(customers[0])];
    }
    console.log($scope.customers);
}.bind(this));
0 голосов
/ 28 июня 2018

Вы можете нормализовать свойства, чтобы они были прописными или строчными:

// Customers with a sample customer as provided in some comment by the OP
const customers = [{
    "account_id": 1,
    "account_type_description": "Single Account",
    "customer_id": 1,
    "first_name": "Peter",
    "last_name": "Parker",
    "identity_card_number": 128,
    "tax_identification": 35,
    "birth_date": "2018-06-28T07:57:23Z",
    "customer_gender_description": "Male",
    "street_address": "Gotham Street 56",
    "postal_code": "21312",
    "city": "Gotham",
    "country_description": "Portugal"
  },
  {
    "ACCOUNT_ID": 1,
    "ACCOUNT_TYPE_DESCRIPTION": "Single Account",
    "CUSTOMER_ID": 1,
    "FIRST_NAME": "Peter",
    "LAST_NAME": "Parker",
    "IDENTITY_CARD_NUMBER": 128,
    "TAX_IDENTIFICATION": 35,
    "BIRTH_DATE": "2018-06-28T07:57:23Z",
    "CUSTOMER_GENDER_DESCRIPTION": "Male",
    "STREET_ADDRESS": "Gotham Street 56",
    "POSTAL_CODE": "21312",
    "CITY": "Gotham",
    "COUNTRY_DESCRIPTION": "Portugal"
  }
]

const normalizeProperties = entities => entities.map(customer => {
  const outputCustomer = {}

  for (let property of Object.keys(customer))
    outputCustomer[property.toLowerCase()] = customer[property]

  return outputCustomer
})

const normalizedCustomers = normalizeProperties(customers)

console.log(JSON.stringify(normalizedCustomers))

Существует множество подходов для получения одного и того же результата, но идея в том, что вы не хотите, чтобы эти различия были связаны с привязкой модели к пользовательскому интерфейсу.

0 голосов
/ 28 июня 2018

Чтобы игнорировать регистр для всех ключей в JSON, вы можете определить пользовательский метод получения для объекта, как показано ниже

Object.defineProperty(Object.prototype, "getProp", {
    value: function (prop) {
        var key,self = this;
        for (key in self) {
            if (key.toLowerCase() == prop.toLowerCase()) {
                return self[key];
            }
        }
    },
    enumerable: false
});

Теперь вы можете получить свойства, игнорируя регистр, подобный этому

obj.getProp("CUSTOMER_ID");
//or
obj.getProp("customer_id");
0 голосов
/ 28 июня 2018

Я бы пошел с нормализацией свойств, т.е. с lodash вы можете использовать mapKeys:

const input = { CUSTOMER_ID: 1, name: 'foo' };
const normalized = _.mapKeys(input, (value, key) => key.toLowerCase());

// {customer_id: 1, name: "foo"}

console.log(normalized.customer_id); // 1

Если свойства могут быть записаны как camelCase, вы также можете нормализовать свойства с snakeCase:

const input = { CUSTOMER_ID: 1, otherId: 3, name: 'foo' };
const normalized = _.mapKeys(input, (value, key) => _.snakeCase(key));

// {customer_id: 1, other_id: 5, name: "foo"}

console.log(normalized.other_id); // 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...