1

I have java class which contains simple String fields and some of this fields can contain non-ascii symbols and wath that during serialization in JSON this symbols will be converted in \u0000. I know that I can do it by Jackson, but it can't be used by internal reason.

As ex. Java class

public class SomeClass {
    String filed1;

    // getter/setter
}

Converted code:

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

As result should be JSON:

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

Instead of

{fild1:'Пример'}
Vartlok
  • 2,539
  • 3
  • 32
  • 46

1 Answers1

2

Okey, I have found solution. Possible it will be helpfull for someone.

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 );
Vartlok
  • 2,539
  • 3
  • 32
  • 46