Сохранение массива значений ключа в компактную строку JSON - PullRequest
16 голосов
/ 18 июня 2011

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

// the JSON data may store several data types, not just key value lists,
// but, must be able to identify some data as a key value list

// --> more "common" way to store a key value array
{
  [
    {"key": "slide0001.html", "value": "Looking Ahead"},
    {"key": "slide0008.html", "value": "Forecast"},
    {"key": "slide0021.html", "value": "Summary"},
    // another THOUSANDS KEY VALUE PAIRS
    // ...
  ],
  "otherdata" : { "one": "1", "two": "2", "three": "3" }
}

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

// --> (1) a "compact" way to store a key value array
{    
  [
      {"slide0001.html", "Looking Ahead"},
      {"slide0008.html", "Forecast"},
      {"slide0021.html", "Summary"},
      // another THOUSANDS KEY VALUE PAIRS
      // ...
  ],
  "otherdata" : { "one": "1", "two": "2", "three": "3" }
}

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

// --> (2) a "compact" way to store a key value array    
{
    "keyvaluelist":
    [
      {"slide0001.html", "Looking Ahead"},
      {"slide0008.html", "Forecast"},
      {"slide0021.html", "Summary"},
      // another THOUSANDS KEY VALUE PAIRS
      // ...
    ],
    "otherdata" : { "one": "1", "two": "2", "three": "3" }
}

// --> (3) a "compact" way to store a key value array    
{
    "mylist":
    {
      "type": "keyvaluearray",
  "data":
    [
        {"slide0001.html", "Looking Ahead"},
        {"slide0008.html", "Forecast"},
        {"slide0021.html", "Summary"},
                    // another THOUSANDS KEY VALUE PAIRS
                    // ...
    ]
    },
    "otherdata" : { "one": "1", "two": "2", "three": "3" }
}

Что вы думаете, какой из них вы предлагаете, у вас есть другой путь? Благодаря.

ОБНОВЛЕНИЕ 1: Удалить неверный код. Javascript => JSON

ОБНОВЛЕНИЕ 2: Добавить данные неключевого значения

ОБНОВЛЕНИЕ 3: заменить "[" и "]" на "{" и "}" в каждой паре значений ключей

Ответы [ 4 ]

16 голосов
/ 18 июня 2011

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

var params = {
    'slide0001.html': 'Looking Ahead',
    'slide0002.html': 'Forecase',
    ...
};

return params['slide0001.html']; // returns: Looking Ahead
13 голосов
/ 19 июня 2011

Если логика синтаксического анализа этого знает , что {"key": "slide0001.html", "value": "Looking Ahead"} является парой ключ / значение, вы можете преобразовать ее в массив и содержать несколько констант, указывающих, какой индекс соответствует какому ключу.

Например:

var data = ["slide0001.html", "Looking Ahead"];

var C_KEY = 0;
var C_VALUE = 1;

var value = data[C_VALUE];

Итак, теперь ваши данные могут быть:

[
    ["slide0001.html", "Looking Ahead"],
    ["slide0008.html", "Forecast"],
    ["slide0021.html", "Summary"]
]

Если ваша логика синтаксического анализа не знает заранее о структуре данныхВы можете добавить некоторые метаданные для его описания.Например:

{ meta: { keys: [ "key", "value" ] },
  data: [
    ["slide0001.html", "Looking Ahead"],
    ["slide0008.html", "Forecast"],
    ["slide0021.html", "Summary"]
  ]
}

... который затем будет обработан синтаксическим анализатором.

3 голосов
/ 19 июня 2011

Для меня это наиболее «естественный» способ структурирования таких данных в JSON при условии, что все ключи являются строками.

{
    "keyvaluelist": {
        "slide0001.html": "Looking Ahead",
        "slide0008.html": "Forecast",
        "slide0021.html": "Summary"
    },
    "otherdata": {
        "one": "1",
        "two": "2",
        "three": "3"
    },
    "anotherthing": "thing1",
    "onelastthing": "thing2"
}

Я читаю это как

a JSON object with four elements
    element 1 is a map of key/value pairs named "keyvaluelist",
    element 2 is a map of key/value pairs named "otherdata",
    element 3 is a string named "anotherthing",
    element 4 is a string named "onelastthing"

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

0 голосов
/ 16 января 2018

Для использования пары ключ / значение в json используйте объект и не используйте массив

Найти имя / значение в массиве сложно, но в объекте легко

Ex:

var exObj = {
  "mainData": {
    "slide0001.html": "Looking Ahead",
    "slide0008.html": "Forecast",
    "slide0021.html": "Summary",
    // another THOUSANDS KEY VALUE PAIRS
    // ...
  },
  "otherdata" : { "one": "1", "two": "2", "three": "3" }
};
var mainData = exObj.mainData;
// for use:
Object.keys(mainData).forEach(function(n,i){
  var v = mainData[n];
  console.log('name' + i + ': ' + n + ', value' + i + ': ' + v);
});

// and string length is minimum
console.log(JSON.stringify(exObj));
console.log(JSON.stringify(exObj).length);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...