Обновление 2:
Подумав немного, я понял, что RegExp
-s может работать в вашем случае без особых хлопот.
Ключи в JSON относительно легко отличить guish от строковых значений:
function test(str, regexp) {
console.log(
Array.from(str.matchAll(regexp), m => m[1])
)
}
// to match a key
test(`{"key1": 1, "key2": 2}`, /\"(.*?)\":/g)
// to match a key followed by spases
test(`{"key1" \n: 1, "key2"\t: 2}`, /\"(.*?)\"\s*:/g)
// to ignore string values
test(`{"key1": "qwer", "key2": 2}`, /\"([^"]*?)\"\s*:/g)
// to ignore escapes in string values
test(`{"key1": "\\"not_a_key\\":", "key2": 2}`, /(?<!\\)\"([^"]*?)(?<!\\)\"\s*:/g)
Итак, вернемся к своему коду ... Вы можете увидеть правильный результат в следующем фрагменте:
let defaultJsonFormFields = [
"conditionals", "order", "key", "value", "grpOperation", "condition",
"offset",
"alert",
"mAlertType", "mTitle", "mMessage", "mNotificationMsg", "mSeverity", "mEnabled",
]
const editedjson_str = '{\
"": [{\
"": "1",\
"key": "gefvsgwer",\
"value": "dghthdffbhrthrdvgrthtuem",\
"grpOperation": "wrfllkwjflmefveveveve",\
"condition": ">"\
}],\
"": "15",\
"": {\
"": "so new thing",\
"mTitle": "abcdef",\
"mMessage": "ok so be it",\
"mNotificationMsg": "whatever",\
"mSeverity": "LOW",\
"mEnabled": "true"\
}\
}'
let editedjson
// before checking the keys, try to parse editedjson_str
// - no need to report key errors if JSON is invalid in general
//try {
editedjson = JSON.parse(editedjson_str)
//} catch() { ... }
const editedJsonFormFields = Array.from(editedjson_str.matchAll(/(?<!\\)\"([^"]*?)(?<!\\)\"\s*:/g), m => m[1])
let result = defaultJsonFormFields.filter(item => editedJsonFormFields.indexOf(item) == -1)
console.log(result)
Но все же этот подход выглядит как грязный хак.
Оригинальный ответ:
единственное, что вам нужно, это log
ваш editedjson
, и вы увидите, что это не то, что вы ожидаете. Попробуйте:
let editedjson = {
"": [{
"": "1",
"key": "gefvsgwer",
"value": "dghthdffbhrthrdvgrthtuem",
"grpOperation": "wrfllkwjflmefveveveve",
"condition": ">"
}],
"": "15",
"": {
"": "so new thing",
"mTitle": "abcdef",
"mMessage": "ok so be it",
"mNotificationMsg": "whatever",
"mSeverity": "LOW",
"mEnabled": "true"
}
}
console.log(editedjson)
Причина этого в том, что объекты не могут содержать разные значения для одного и того же ключа (и JSON). В этом случае у вас есть root из editedjson
3 клавиш с одинаковым значением ""
, и остается только последняя. Другие перезаписываются.
Если вы уточните, какого именно поведения вы пытаетесь достичь, я могу обновить свой ответ с помощью кода, который будет делать.
Основная проблема заключается в том, что вы просто не может получить от пользователя объект с ключами, которые не являются уникальными. Но вы можете получить строку (и, вероятно, ее не следует называть JSON) ... но на самом деле вы не должны, потому что вам придется анализировать ее по сами. Таким образом, вам нужно выбрать другой формат для данных, которые вы ожидаете от пользователя.
Обновление:
После обновления на ваш вопрос я перешел по вашей второй ссылке к действительному функционалу и понял, что должен был поскорее предложить " код, который будет делать ". Как я вижу, вы действительно получаете от пользователя строку , и, как я сказал , вы действительно не должны . Вы не получите нигде с JSON.parse()
. И я не могу дать вам полноценный парсер для , даже не JSON с произвольными ошибками в нем. Все, что я могу предложить в этом случае:
- Лучшее решение: использовать формы, с отдельным полем для каждого значения. Как видно из примера, данные имеют постоянную структуру (также вы сравниваете ее с предопределенной
defaultjson
). Если это так - нет причин усложнять что-либо для пользователя и для себя Используйте regexp-s, чтобы проверить, отсутствует ли какой-либо ключ из defaultJsonFormFields
в строке. Или если есть дубликаты ключей. И только потом попробуйте JSON.parse()
. Но у вас будут тяжелые времена с большим количеством крайних случаев. Например, отличая
{ ... "key": "some text" ... }
от
{ ... "wrong key": "key" ... }
- Для данных произвольной структуры просто измените свой подход к сообщению об ошибках: если нет
editedjson.conditionals
- сообщите об этом, и не пытайтесь сообщить, что editedjson.conditionals.order
также отсутствует, но как-то все нормально с editedjson.conditionals.grpOperation
(потому что это не так - нет такого пути, как editedjson.conditionals.grpOperation
) *