Как мне избежать строк в JSON? - PullRequest
142 голосов
/ 11 июня 2010

Как вручную создавать строковые поля при создании данных JSON? Должен ли я использовать что-то вроде Apache Commons Lang StringEscapeUtilities.escapeHtml, StringEscapeUtilities.escapeXml, или я должен использовать java.net.URLEncoder?

Проблема в том, что когда я использую SEU.escapeHtml, он не экранирует кавычки, а когда я обертываю всю строку в пару ' s, генерируется неправильный JSON.

Ответы [ 18 ]

146 голосов
/ 11 июня 2010

В идеале, найти библиотеку JSON на вашем языке , в которую вы можете передать некоторую подходящую структуру данных, и позволить ей беспокоиться о том, как избежать вещей . Это будет держать вас намного разумнее. Если по какой-либо причине у вас нет библиотеки на вашем языке, вы не хотите использовать ее (я бы не советовал это делать), или вы пишете библиотеку JSON, читайте дальше.

Побег это в соответствии с RFC. JSON довольно либерален: единственные символы, которые вы должны экранировать, это \, " и управляющие коды (все, что меньше U + 0020).

Эта структура экранирования специфична для JSON. Вам понадобится особая функция JSON. Все экранированные значения можно записать как \uXXXX, где XXXX - это кодовая единица UTF-16¹ для этого символа. Есть несколько комбинаций клавиш, например \\, которые также работают. (И они приводят к меньшему и более четкому выводу.)

Для получения полной информации см. RFC .

esc JSON основан на JS, поэтому он использует \uXXXX, где XXXX - кодовая единица UTF-16. Для кодовых точек вне BMP это означает кодирование суррогатных пар, что может быть немного затруднительно. (Или вы можете просто вывести символ напрямую, так как для JSON кодируется текст Unicode, и он разрешает эти конкретные символы.)

51 голосов
/ 20 мая 2013

Выписка из Jettison :

 public static String quote(String string) {
         if (string == null || string.length() == 0) {
             return "\"\"";
         }

         char         c = 0;
         int          i;
         int          len = string.length();
         StringBuilder sb = new StringBuilder(len + 4);
         String       t;

         sb.append('"');
         for (i = 0; i < len; i += 1) {
             c = string.charAt(i);
             switch (c) {
             case '\\':
             case '"':
                 sb.append('\\');
                 sb.append(c);
                 break;
             case '/':
 //                if (b == '<') {
                     sb.append('\\');
 //                }
                 sb.append(c);
                 break;
             case '\b':
                 sb.append("\\b");
                 break;
             case '\t':
                 sb.append("\\t");
                 break;
             case '\n':
                 sb.append("\\n");
                 break;
             case '\f':
                 sb.append("\\f");
                 break;
             case '\r':
                sb.append("\\r");
                break;
             default:
                 if (c < ' ') {
                     t = "000" + Integer.toHexString(c);
                     sb.append("\\u" + t.substring(t.length() - 4));
                 } else {
                     sb.append(c);
                 }
             }
         }
         sb.append('"');
         return sb.toString();
     }
36 голосов
/ 09 января 2012

Попробуйте это org.codehaus.jettison.json.JSONObject.quote("your string").

Скачать здесь: http://mvnrepository.com/artifact/org.codehaus.jettison/jettison

23 голосов
/ 23 июля 2012

org.json.simple.JSONObject.escape () экранирует кавычки, \, /, \ r, \ n, \ b, \ f, \ t и другие управляющие символы.Может использоваться для экранирования кодов JavaScript.

import org.json.simple.JSONObject;
String test =  JSONObject.escape("your string");
21 голосов
/ 31 марта 2014

Apache commons lang теперь поддерживает это.Просто убедитесь, что у вас есть достаточно свежая версия Apache Commons Lang на вашем пути к классам.Вам потребуется версия 3.2 +

Примечания к выпуску для версии 3.2

LANG-797: добавлен escape / unescapeJson в StringEscapeUtils.

9 голосов
/ 05 октября 2016

org.json.JSONObject quote(String data) метод делает работу

import org.json.JSONObject;
String jsonEncodedString = JSONObject.quote(data);

Выписка из документации:

Кодирует данные в виде строки JSON. Это относится к кавычкам и экранированию всех необходимых символов . [...] Null будет интерпретироваться как пустая строка

6 голосов
/ 26 сентября 2013

StringEscapeUtils.escapeJavaScript / StringEscapeUtils.escapeEcmaScript тоже надо делать.

4 голосов
/ 06 октября 2016

Если вы используете fastexml Jackson, вы можете использовать следующее: com.fasterxml.jackson.core.io.JsonStringEncoder.getInstance().quoteAsString(input)

Если вы используете Codehaus Jackson, вы можете использовать следующее: org.codehaus.jackson.io.JsonStringEncoder.getInstance().quoteAsString(input)

3 голосов
/ 11 июня 2010

Не уверен, что вы подразумеваете под "созданием json вручную", но вы можете использовать что-то вроде gson (http://code.google.com/p/google-gson/),), и это преобразовало бы ваш HashMap, Array, String и т. Д. В значение JSON. Я рекомендую перейтис рамками для этого.

2 голосов
/ 04 ноября 2014

Для тех, кто пришел сюда в поисках решения для командной строки, как я, cURL --data-urlencode отлично работает:

curl -G -v -s --data-urlencode 'query={"type" : "/music/artist"}' 'https://www.googleapis.com/freebase/v1/mqlread'

отправляет, например,

GET /freebase/v1/mqlread?query=%7B%22type%22%20%3A%20%22%2Fmusic%2Fartist%22%7D HTTP/1.1

,Большие JSON-данные могут быть помещены в файл, и вы будете использовать синтаксис @, чтобы указать файл, из которого следует выходить из данных, из которых необходимо выйти.Например, если бы

$ cat 1.json 
{
  "type": "/music/artist",
  "name": "The Police",
  "album": []
}

вы бы использовали

curl -G -v -s --data-urlencode query@1.json 'https://www.googleapis.com/freebase/v1/mqlread'

А теперь, это также учебник о том, как запросить Freebase из командной строки: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...