Как уже упоминалось в комментариях, ConvertTo-Json
попытается сгладить структуру объекта за максимальный уровень вложенности или depth , путем преобразования любого объекта, который он находит вне этого глубина до строки.
Глубина по умолчанию - 2, но вы можете указать, что она должна идти глубже с параметром Depth
:
PS C:\> @{root=@{level1=@{level2=@("level3-1","level3-2")}}}|ConvertTo-Json
{
"root": {
"level1": {
"level2": "level3-1 level3-2"
}
}
}
PS C:\> @{root=@{level1=@{level2=@("level3-1","level3-2")}}}|ConvertTo-Json -Depth 3
{
"root": {
"level1": {
"level2": [
"level3-1",
"level3-2"
]
}
}
}
Символ ESC', таким образом, необходимо было бы заменить кавычку двумя кавычками.
Например,
SELECT * FROM PEOPLE WHERE SURNAME='O'Keefe'
становится
SELECT * FROM PEOPLE WHERE SURNAME='O''Keefe'
Тем не менее, вероятно, неправильно сделать это самостоятельно. Ваш язык может иметь функцию для выхода из строк для использования в SQL, но ровный более оптимальный вариант состоит в том, чтобы использовать параметры. Обычно это работает следующим образом.
Ваша команда SQL была бы:
SELECT * FROM PEOPLE WHERE SURNAME=?
Затем при выполнении его Вы передаете в "O'Keefe" в качестве параметра.
Поскольку SQL анализируется, прежде чем значение параметра установлено, нет никакого пути к значению параметра для изменения структуры SQL (и это даже немного быстрее, если Вы хотите выполнить тот же оператор несколько раз с различными параметрами).
Я должен также указать на это, в то время как Ваши правые дела в качестве примера ошибка, Вы открываете себя много других проблем, не выходя из строк соответственно. См. http://en.wikipedia.org/wiki/SQL_injection для хорошей начальной точки или следующего классического xkcd комика.
Решение Oracle 10
SELECT * FROM PEOPLE WHERE SURNAME=q'{O'Keefe}'
Параметризированные запросы являются Вашим другом, как предложил Matt.
Command = SELECT * FROM PEOPLE WHERE SURNAME=?
Они защитят Вас от головных болей, связанных с
Я предполагаю, что хороший вопрос - то, какой язык Вы используете?
В PHP Вы сделали бы: ВЫБЕРИТЕ * ОТ ЛЮДЕЙ ГДЕ ФАМИЛИЯ ='mysql_escape_string (O'Keefe)'
Но так как Вы не указывали язык, я предложу, чтобы Вы изучили строковую функцию Escape mysql или иначе на Вашем языке.
Использование параметризованного SQL обладает другими преимуществами, это уменьшает ЦП наверху (а также другие ресурсы) в Oracle путем сокращения объема работы, которого Oracle требует для парсинга оператора. Если Вы не используете параметры (мы называем их, связывают переменные в Oracle), затем "выбор * от нечто, откуда панель ='cat'" и "выбор * нечто, где панель ='dog'" рассматриваются как отдельные операторы, где как "выбор * от нечто, где панель =:b1" является тем же оператором, означая вещи как синтаксис, законность объектов, на которые ссылаются и т.д...., не должна быть проверена снова. Существуют случайные проблемы, которые возникают, когда использование связывает переменные, который обычно проявляется в не получении самого эффективного плана выполнения SQL, но существуют обходные решения для этого, и эти проблемы действительно зависят от предикатов, которые Вы используете, индексируя и скос данных.
Входная фильтрация обычно делается на уровне языка, а не слоях базы данных.
php и.NET оба имеют их соответствующие библиотеки для выхода sql операторы. Проверьте свой язык, см. доступный waht's.
Если Ваши данные trustable, то можно просто сделать строковую замену для добавления другого 'infront' для выхода из него. Обычно это достаточно, при отсутствии рисков, что вход является злонамеренным.