2016-05-23 2 views
1

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

const jsString = JSON.stringify({"escaping":"d\"on't"}); 

const insertion = [{"a":2,"json":jsString}]; 

const query = pgp.helpers.insert(insertion,["a","json"],"tbl"); 

однако, что на самом деле заканчивается в базе данных:

{"escaping":"d"on't"} 

удаление убегающей \ в d "on't и делает строку недопустимого JSON. есть ли какой-нибудь способ избежать этого?

Это было бы выгодно, так как было бы хорошо, если бы моим действительным json остался бы таким.

+0

Попробуйте использовать двойную обратную косую черту. Потому что один из них потребляется самим JavaScript. – ahwayakchih

+0

на самом деле сделать его тройным, дважды поставить один обратный слэш в базу данных и еще один, чтобы избежать двойного кавычки в JS. – ahwayakchih

+0

Вы пробовали это '{" escaping ":" d \\\ "on't"} '? Что такое строка, которую вы хотите сохранить? Этот код сохранит это {" escaping ":" d \ "on ' t "} –

ответ

2
  1. Не stringify данные в формате JSON, использовать его непосредственно
  2. Упорядочить форматирование столбцов как JSON, используя :json модификатор

const data = {escaping: "d\"on't"}; 
 
const insertion = [{a:2, json:data}]; 
 
const query = pgp.helpers.insert(insertion, ["a", "json:json"], "tbl");

Но если ваш data всегда является объектом, то вам даже не нужно использовать модификатор :json, он будет автоматически отформатирован в правильном формате JSON.

Для получения дополнительной информации см. Гибкость типа ColumnSet. Вы можете манипулировать своими входными данными всеми мыслимыми способами.

+0

Но при вставке в качестве объектов d "все равно заканчивается в базе данных, а не d \" on't, которая необходима для того, чтобы она была действительной json – Bomaz

+1

@Bomaz Что вы говорите? пишет и читает эти данные просто отлично. Я тестировал их локально. –

+0

Когда я тестирую его локально, я получаю d \ "on't в запросе. Однако, поскольку sql использует \, чтобы избежать «то, что должно быть в запросе, вероятно, должно быть d \\\», так как для того, чтобы он был действительным JSON, что должно быть в базе данных: {"escaping" : "d \" on't "}, и сам sql потребляет \, если он не превращен в \\\ – Bomaz

0

Эта строка в JS const jsString = JSON.stringify({"escaping":"d\\\"on't"}); приведет к этому {"escaping":"d\\\"on't"}

В то время как эта строка в Js const jsString = JSON.stringify({"escaping":"don't"}); приведет к этому {"escaping":"don't"}

+0

Но я хотел бы избежать реализации ручного экранирования строки. Я получаю его из другого места и просто вставляю его в db. Есть ли способ сделать это? – Bomaz

+0

Не так уж плохо заменить с помощью регулярного выражения. Вот пример: 'var str =" ваш \ "weird \\\" string "; str = str.replace (/ [\\ "]/g, function (x) {return" \\ "+ x;}); ' –

+0

', если это вам поможет, пожалуйста, дайте мне знать, поэтому я отредактирую свою ответ для вас –

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