2016-07-06 3 views
6

Я пытаюсь JSONify объекта Javascript только для получения ошибки «Недопустимая длина строки». Я решил разбить объект на более мелкие части, использовать JSON.stringify на небольших частях и добавить каждый сегмент в файл.Как разбить объект javascript на более мелкие части

Сначала я преобразовал объект javascript в массив и разделил его на более мелкие части.

{'key1': [x, y, z], 'key2' : [p, q, l], ...... } - образец оригинального объекта в обозначении JSON. Каждый символ x, y, z, p, q, l является аббревиатурой базовой строки 64, которая достаточно длинна, чтобы вызвать проблему переполнения длины строки.

[ ['key1', x], ['key1', y], ['key1', z], ['key2', p], .......] - массив конвертируется

var arrays = [] 
while (arrayConvertedObject.length > 0) 
    arrays.push(arrayConvertedObject.slice(0, 2)) 
} 

Тогда я собирался создать JavaScript Object для каждого из небольших массивов в arrays использовать JSON.stringify индивидуально.

[["key1", x], ["key1", y]] - array 1 
[["key1", z], ["key2", p]] - array 2 

Когда я конвертировать все меньший массив в объект Javascript и использовать JSON.stringify, я получаю:

{"key1": [x, y]} - string 1 
{"key1": [z], "key2": [p]} - string 2 

Проблема заключается в том, что конкатенация с дополнительной манипуляции },{ не сохранит оригинал данные:

{"key1": [x, y], "key1": [z], "key2": [p]} 

Когда я хочу obj["key1"] иметь [x, y, z], то JSON выше будет анализироваться в obj["key1"] = [z].

Если я не использую JSON.stringify на небольших объектах, это победит мою первоначальную цель JSONifying большого javascript-объекта. Но если я это сделаю, я не могу объединить JSONified небольшие объекты с дублирующими ключами.

Есть ли лучший способ справиться с ошибкой JSON.stringify «Недопустимая длина строки»? Если нет, существует ли способ объединить объекты JSONified без переопределения дубликатов ключей?

Спасибо, что прочитали длинный вопрос. Любая помощь будет оценена.

+0

добавьте исходный объект, вы хотите, чтобы манипулировать и разыскиваемый результат. –

+1

Спасибо, что прочитал мой вопрос. Просто обновил свой вопрос, чтобы отразить ваше предложение. – sawa

+0

, в то время как я получаю проблему, я пропускаю часть, мы снова добавляем значения. сделать JSON (строку) с частями и проанализировать его для объекта? или вы создаете объект из частиц? –

ответ

1

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

Не производили сравнение производительности.

var x="X", y="Y", z="Z", p="P"; 
 

 
// your starting arrays 
 
var subArrs = [ ['key1', x], ['key1', y], ['key1', z], ['key2', p]]; 
 

 
// the result should be in this string 
 
var jsonString = "{}"; 
 

 
// take each subArray 
 
subArrs.map(function(subArr) { 
 
    var key = subArr[0]; 
 
    var val = subArr[1]; 
 
    // try to look for the key in the string 
 
    var keyMatcher = '"'+key+'":\\['; 
 
    var endOfObjectMatcher = '\\}$'; 
 
    var regexStr = keyMatcher + '|' + endOfObjectMatcher; 
 
    jsonString = jsonString.replace(new RegExp(regexStr), function(match){ 
 
     if (match=='}') { 
 
     // the end of the object has been matched, 
 
     // so simply append the new key-value pair 
 
     return ',"'+key+'":['+JSON.stringify(val)+"]}"; 
 
     } else { 
 
     // an existing key has been found, 
 
     // so prepend the value to the beginning of the array 
 
     // (match contains something like: '"somekey":[' 
 
     return match + JSON.stringify(val) + ","; 
 
     } 
 
    }); 
 
}); 
 

 
// replace the falsely added first comma in the object 
 
jsonString = jsonString.replace('{,','{'); 
 

 
// print it here 
 
document.write(">>" + jsonString + "<br/>");
body { 
 
    font-family: monospace; 
 
}

+0

Благодарим за помощь. Я ценю это. – sawa

1

Это нормальный компресс.

{"key1": [1, 2], "key1": [3], "key2": [4]}

Вы определяете 2 раза атрибут key1. Но каждый ключ должен быть уникальным. Таким образом, второе объявление отменяет первое.

Это думает, что вы должны изменить метод конкатенации для объединения каждой строки JSON в массив, как это:

[ 
    {"key1": [1, 2]}, 
    {"key1": [3], "key2": [4]} 
] 

Что вы Node.js версия?

Я пытаюсь JSONify объекта Javascript только для того, чтобы получить «Неверная строка Длина ошибки».

Это старый номер двигателя V8, см. issue #14170. Возможно, вас попросят использовать большую версию Node.JS.

+0

Спасибо за ваше предложение. – sawa

Смежные вопросы