[java] JSON에서 문자열을 어떻게 이스케이프해야합니까?

JSON 데이터를 수동으로 생성 할 때 문자열 필드를 어떻게 이스케이프해야합니까? 아파치 코 몬즈 랭의 같은해야 내가 사용 무언가 StringEscapeUtilities.escapeHtml, StringEscapeUtilities.escapeXml또는 사용해야합니까 java.net.URLEncoder?

문제는을 사용할 때 SEU.escapeHtml따옴표를 이스케이프하지 않고 전체 문자열을 's 쌍으로 감싸면 잘못된 JSON이 생성된다는 것입니다.



답변

언어 에 맞는 적절한 데이터 구조를 제공 할 수 있는 JSON 라이브러리를 찾고 이스케이프 처리 방법에 대해 걱정 하는 것이 이상적 입니다. 훨씬 더 건강하게 유지합니다. 어떤 이유로 든 귀하의 언어로 된 라이브러리가 없다면, 하나를 사용하고 싶지 않거나 (이 제안하지 않을 것 ¹) JSON 라이브러리를 작성하는 경우 계속 읽으십시오.

RFC에 따라 이스케이프 처리하십시오. JSON은 매우 진보적이다 : 당신이 유일한 문자가 있어야 탈출은 \, "제어 코드 (아무것도 덜 U + 0020 이상)합니다.

이스케이프 구조는 JSON에만 해당됩니다. JSON 특정 기능이 필요합니다. 모든 이스케이프는 해당 문자의 UTF-16 코드 단위 ¹가있는 \uXXXX위치 로 작성할 수 있습니다 XXXX. 과 같은 몇 가지 단축키 \\가 있습니다. (그리고 그것들은 더 작고 더 선명한 결과를 낳습니다.)

자세한 내용 은 RFC를 참조하십시오 .

¹JSON의 탈출은 그래서 사용 JS에 내장되는 \uXXXX경우, XXXXUTF-16 코드 유닛이다. BMP 외부의 코드 포인트의 경우 이는 대리 쌍을 인코딩하는 것을 의미하며 약간 털이 될 수 있습니다. (또는 JSON의 인코딩은 유니 코드 텍스트이므로 이러한 특정 문자를 허용하므로 문자를 직접 출력 할 수 있습니다.)


답변

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();
     }


답변

이것을보십시오 org.codehaus.jettison.json.JSONObject.quote("your string").

여기에서 다운로드하십시오 : http://mvnrepository.com/artifact/org.codehaus.jettison/jettison


답변

org.json.simple.JSONObject.escape ()는 따옴표, \, /, \ r, \ n, \ b, \ f, \ t 및 기타 제어 문자를 이스케이프합니다. JavaScript 코드를 이스케이프 처리하는 데 사용할 수 있습니다.

import org.json.simple.JSONObject;
String test =  JSONObject.escape("your string");


답변

Apache commons lang은 이제 이것을 지원합니다. 클래스 경로에 최신 버전의 Apache Commons lang이 있는지 확인하십시오. 버전 3.2 이상이 필요합니다

버전 3.2 릴리스 정보

LANG-797 : StringEscapeUtils에 escape / unescapeJson을 추가했습니다.


답변

org.json.JSONObject quote(String data) 방법은 일을한다

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

문서에서 추출하십시오.

데이터를 JSON 문자열로 인코딩합니다. 이것은 따옴표와 필요한 문자 이스케이프를 적용합니다 . […] Null은 빈 문자열로 해석됩니다.


답변

StringEscapeUtils.escapeJavaScript/ StringEscapeUtils.escapeEcmaScript트릭도 수행해야합니다.