web-dev-qa-db-fra.com

Stockage d'un tableau de valeurs de clé dans une chaîne JSON compacte

Je veux stocker un tableau d'éléments de valeur clés, une façon courante de le faire pourrait être quelque chose comme:

// 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" }
}

Mais, quand il y a beaucoup de paires/items, la longueur de chaîne devient interdite, .__ et je veux un moyen compact, ceci pourrait être un exemple:

// --> (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" }
}

De plus, je veux un moyen d'identifier les données en tant que tableau de valeurs de clé, .__, car je souhaiterais peut-être stocker d'autres données dans le même fichier JSON J'ai ces exemples:

// --> (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" }
}

Qu'est-ce que vous pensez, lequel suggérez-vous, avez-vous un autre moyen? Merci.

UPDATE 1: Supprimez le code non valide. Javascript => JSON

UPDATE 2: Ajouter des données non clés

UPDATE 3: Remplacer "[" et "]" par "{" et "}" dans chaque paire de valeurs de clé

16
umlcat

Si la logique analysant ce sait que {"key": "slide0001.html", "value": "Looking Ahead"} est une paire clé/valeur, vous pouvez le transformer en tableau et conserver quelques constantes indiquant quel index correspond à quelle clé.

Par exemple:

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

var C_KEY = 0;
var C_VALUE = 1;

var value = data[C_VALUE];

Alors, maintenant, vos données peuvent être:

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

Si votre logique d'analyse ne connaît pas à l'avance la structure des données, vous pouvez ajouter des métadonnées pour la décrire. Par exemple:

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

... qui serait ensuite traité par l'analyseur.

13
rid

Alors, pourquoi ne pas simplement utiliser un littéral valeur-clé?

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

return params['slide0001.html']; // returns: Looking Ahead
15
Crozin

Pour moi, il s'agit du moyen le plus "naturel" de structurer de telles données en JSON, à condition que toutes les clés soient des chaînes.

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

Je lis ceci comme 

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"

Le premier élément ou le deuxième élément pourrait également être décrit comme des objets eux-mêmes, bien entendu, avec trois éléments chacun.

3
Programmer Bruce

Pour utiliser une paire clé/valeur dans json, utilisez un objet et n'utilisez pas de tableau

Trouver un nom/une valeur dans un tableau est difficile, mais facile dans un objet

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);

0
morteza ataiy