2015-04-27 2 views
1

У меня есть класс java, который содержит простые поля String, и некоторые из этих полей могут содержать символы не-ascii и wath, что при сериализации в JSON эти символы будут преобразованы в \u0000. Я знаю, что я могу сделать это Джексоном, но он не может быть использован внутренним разумом.Escape non-ascii symbol by Flex JSON

As ex. Класс Java

public class SomeClass { 
    String filed1; 

    // getter/setter 
} 

Преобразованный код:

public String convert(SomeClass someClass) { 
    new JSONSerializer().include("*").serialize(someClass); 
} 

В результате должно быть в формате JSON:

{fild1:'\u041F\u0440\u0438\u0432\u0435\u0442'} 

Вместо

{fild1:'Пример'} 

ответ

2

Окей, я нашел решение. Возможно, это будет полезно для кого-то.

JSONSerializer serializer = new JSONSerializer().transform(new AbstractTransformer() { 
     @Override 
     public void transform(Object object) { 

      String value = object.toString(); 
      int len = value.length(); 
      StringBuilder stringBuilder = new StringBuilder("\""); 
      for (int i = 0; i < len; i++) { 
       char c = value.charAt(i); 
       if (c == '"') { 
        stringBuilder.append("\\u0022"); 
       } else if (c == '&') { 
        stringBuilder.append("\\u0026"); 
       } else if (c == '\'') { 
        stringBuilder.append("\\u0027"); 
       } else if (c == '\\') { 
        stringBuilder.append("\\\\"); 
       } else if (c == '\b') { 
        stringBuilder.append("\\b"); 
       } else if (c == '\f') { 
        stringBuilder.append("\\f"); 
       } else if (c == '\n') { 
        stringBuilder.append("\\n"); 
       } else if (c == '\r') { 
        stringBuilder.append("\\r"); 
       } else if (c == '\t') { 
        stringBuilder.append("\\t"); 
       } else if (c > 127) { 
        stringBuilder.append("\\u"); 
        int n = c; 
        for (int j = 0; j < 4; ++j) { 
         int digit = (n & 0xf000) >> 12; 
         stringBuilder.append(String.valueOf(JSONSerializer.HEX[digit])); 
         n <<= 4; 
        } 
       } else { 
        stringBuilder.append(c); 
       } 
      } 
      stringBuilder.append("\""); 
      getContext().write(stringBuilder.toString()); 
     } 
    }, String.class);