10

Spring Framework との統合のために Jackson を使い始めたばかりで、値に一重引用符がある問題に遭遇しました。ページで jQuery を使用して JSON を解析しようとすると、JavaScript エラーが発生します"SyntaxError: missing ) after argument list"。私は Gson を使用してオブジェクトをシリアル化することに慣れていますが、Gson は一重引用符を Unicode \u0027 に置き換えるため、この問題には遭遇しません。

例えば;
ジャワ

public final class Person {
  private String firstName;
  private String lastName;

  public Person() {}

  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }

  public String getFirstName() {
    return firstName;
  }

  public void setLastName(String lastName) {
    this.lastName = lastName;
  }

  public String getLastName() {
    return lastName;
  }
}


JSON
In Jackson [{"person":{"firstName":"James","lastName":"O'tool"}}]
In Gson [{"person":{"firstName":"James","lastName":"O\u0027tool"}}]

JavaScript ;
// This is where the JavaScript fails with the Jackson serialized object
$.parseJSON('${requestScope.person}');

解決策を探しましたが、見つけることができません。Gsonと同じように一重引用符を処理するようにJacksonを構成できるかどうかは誰にもわかりませんか?

お時間をいただきありがとうございます。

4

3 に答える 3

7

もう1つの答えは、これを行う1つの方法を示しており、かなりうまくいくはずです。

しかし、これを行う別の方法もあります。これは少し手間がかかりません。「Jacksonを使用してJSONでHTML文字を強制的にエスケープする」で説明されて います。

于 2013-02-25T19:32:22.683 に答える
2

この問題を解決するために、Jackson 用のカスタム String シリアライザーを作成することになりました。Gson からいくつかのソースを借りました。

    public class HtmlStringSerializer extends StdSerializer<String> {
      protected HtmlStringSerializer() { super(String.class); }

      private static final String[] HTML_SAFE_REPLACEMENT_CHARS;
      static {
        HTML_SAFE_REPLACEMENT_CHARS = new String[128];
        for (int i = 0; i <= 0x1f; i++) {
          HTML_SAFE_REPLACEMENT_CHARS[i] = String.format("\\u%04x", i);
        }
        HTML_SAFE_REPLACEMENT_CHARS['"'] = "\\\"";
        HTML_SAFE_REPLACEMENT_CHARS['\\'] = "\\\\";
        HTML_SAFE_REPLACEMENT_CHARS['\t'] = "\\t";
        HTML_SAFE_REPLACEMENT_CHARS['\b'] = "\\b";
        HTML_SAFE_REPLACEMENT_CHARS['\n'] = "\\n";
        HTML_SAFE_REPLACEMENT_CHARS['\r'] = "\\r";
        HTML_SAFE_REPLACEMENT_CHARS['\f'] = "\\f";
        HTML_SAFE_REPLACEMENT_CHARS['<'] = "\\u003c";
        HTML_SAFE_REPLACEMENT_CHARS['>'] = "\\u003e";
        HTML_SAFE_REPLACEMENT_CHARS['&'] = "\\u0026";
        HTML_SAFE_REPLACEMENT_CHARS['='] = "\\u003d";
        HTML_SAFE_REPLACEMENT_CHARS['\''] = "\\u0027";
      }

      @Override
      public void serialize(String string, JsonGenerator gen, SerializerProvider provider) throws IOException, JsonProcessingException {
        int last = 0;
        int length = string.length();
        StringBuilder sb = new StringBuilder(length);

        for (int i = 0; i < length; i++) {
          char c = string.charAt(i);
          String replacement;
          if (c < 128) {
            replacement = HTML_SAFE_REPLACEMENT_CHARS[c];
            if (replacement == null) { continue; }
          } else if (c == '\u2028') {
            replacement = "\\u2028";
          } else if (c == '\u2029') {
            replacement = "\\u2029";
          } else {
            continue;
          }
          if (last < i) {
        sb.append(string.substring(last, i));
          }
          sb.append(replacement);
          last = i + 1;
        }
        if (last < length) {
          sb.append(string.substring(last));
        }
        gen.writeString(sb.toString());
      }
    }
于 2013-02-25T17:01:44.253 に答える
0

@Bergiは言おうとしていました:使用しないでください:

$.parseJSON('${requestScope.person}')

単に使用する

${requestScope.person}

直接!

于 2013-07-11T13:01:51.830 に答える