2011-06-18 7 views
9

Quiero guardar una serie de elementos clave de valor, una forma común de hacer esto podría ser algo como:Almacenamiento de una matriz de valores clave en una cadena JSON compacta

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

Pero, cuando hay muchos pares/artículos, la longitud de la cadena se convierte prohibidas, y quiero una manera compacta, esto podría ser un ejemplo:

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

Además, quiero una manera de identificar los datos como una matriz de valor clave, porque, es posible que quiera para almacenar otros datos en el mismo archivo JSON. tengo estos ejemplos:

// --> (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é cosa, ¿cuál te sugieres, ¿tienes alguna otra manera? Gracias.

ACTUALIZACIÓN 1: Elimine el código no válido. Javascript => JSON

Actualización 2: Añadir datos de valor no clave

Actualización 3: Reemplazar "[" y "]" para "{" y "}" en cada par de valores clave

+0

No hay una sola línea de JSON en su código. Solo objetos de JavaScript. –

+0

@Felix Kling. Gracias. Elimino el código inválido que lo hace, como JS en lugar de JSon – umlcat

+0

Todavía no es JSON. En JSON, cada tecla (y cadena) tiene que estar entre comillas dobles y algo como 'param =' no existe. –

Respuesta

8

Si la lógica de análisis de este sabe que {"key": "slide0001.html", "value": "Looking Ahead"} es un par clave/valor, entonces se podría transformar en una matriz y mantener una especificando algunas constantes que los mapas de índice a qué tecla.

Por ejemplo:

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

var C_KEY = 0; 
var C_VALUE = 1; 

var value = data[C_VALUE]; 

Así que, ahora, sus datos pueden ser:

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

Si su lógica de análisis no sabe de antemano acerca de la estructura de los datos, puede agrega algunos metadatos para describirlo. Por ejemplo:

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

... que luego sería manejado por el analizador.

+0

Es el caso "no sabe de antemano sobre la estructura de los datos". Gracias – umlcat

11

Entonces, ¿por ¿no usas simplemente un literal clave-valor?

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

return params['slide0001.html']; // returns: Looking Ahead 
+0

Sería como el primer ejemplo, pero no identificará que es una matriz de valores clave. – umlcat

1

Para mí, esta es la forma más "natural" para estructurar dichos datos en JSON, a condición de que todas las claves son cadenas.

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

I leer esto como

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" 

El primer elemento o del segundo elemento, alternativamente, podría ser descrito como objetos a sí mismos, por supuesto, con tres elementos cada uno.

0

para la tecla de uso par/valor en JSON utilizar un objeto y no usar una matriz

Encuentra nombre/valor en la matriz es duro, pero en el objeto es fácil

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

Cuestiones relacionadas