Как выполнить пользовательскую сериализацию в Gson с помощью JsonElement?

Небольшая коррекция. Кажется, что метод IE moveEnd () перемещается постепенно, поэтому selRange.moveEnd('character', end) следует заменить на selRange.moveEnd('character', end-start):

function createSelection(field, start, end) {
    if( field.createTextRange ) {
        var selRange = field.createTextRange();
        selRange.collapse(true);
        selRange.moveStart('character', start);
        selRange.moveEnd('character', end-start);
        selRange.select();
    } else if( field.setSelectionRange ) {
        field.setSelectionRange(start, end);
    } else if( field.selectionStart ) {
        field.selectionStart = start;
        field.selectionEnd = end;
    }
    field.focus();
} 
1
задан rjcarr 1 March 2019 в 23:38
поделиться

1 ответ

Мы не можем изменить внутренние адаптеры для Json* классов, потому что Gson использует предопределенный com.google.gson.internal.bind.TypeAdapters.JSON_ELEMENT . Но, к счастью, мы можем предоставить нашу JsonWriter реализацию. Переопределите методы, которые вам нужны, и предоставьте свою реализацию процессу сериализации. Для округления двойных чисел используйте, например, BigDecimal. Пример пользовательской реализации:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.stream.JsonWriter;

import java.io.IOException;
import java.io.StringWriter;
import java.math.BigDecimal;

public class GsonApp {

    public static void main(String[] args) {
        Gson gson = new GsonBuilder().create();
        JsonArray array = new JsonArray();
        array.add(Math.PI);
        array.add(Math.E);

        StringWriter stringWriter = new StringWriter();
        JsonWriter jsonWriter = new JsonWriter(stringWriter) {
            @Override
            public JsonWriter value(Number value) throws IOException {
                BigDecimal bigDecimal = BigDecimal.valueOf(value.doubleValue());
                BigDecimal result = bigDecimal.setScale(3, BigDecimal.ROUND_UP);

                return super.value(result.doubleValue());
            }
        };
        jsonWriter.setIndent("  ");

        gson.toJson(array, jsonWriter);
        System.out.println(stringWriter.toString());
    }
}

Над кодом напечатаны:

[
  3.142,
  2.719
]

См. Также:

0
ответ дан Michał Ziober 1 March 2019 в 23:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: