Play nutzt (zumindest in Version 1.3?) Gson für JSON-Serialisierung. Gson macht aus Float.NaN die Zahl NaN, was für JSON nicht erlaubt ist:
play.exceptions.JavaExecutionException: NaN is not a valid double value as per JSON specification. To override this behavior, use GsonBuilder.serializeSpecialFloatingPointValues() method.
Schöner wäre es, daraus den String “NaN” zu machen.
Ansatz 1, wie empfohlen:
1 2 3 |
private static Gson gson = new GsonBuilder().serializeSpecialFloatingPointValues().create(); // ... renderJSON(gson.toJson(response)); |
Gleicher Fehler. Deshalb Ansatz 2:
1 2 3 4 5 6 7 8 9 10 11 12 |
private static Gson gson; static { GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(Double.class, new DoubleSerializer()); gsonBuilder.registerTypeAdapter(Float.class, new FloatSerializer()); gson = gsonBuilder.create(); } // ... renderJSON(gson.toJson(response)); |
mit:
1 2 3 4 5 6 |
public static class FloatSerializer implements JsonSerializer<Float> { @Override public JsonElement serialize(Float f, java.lang.reflect.Type type, JsonSerializationContext context) { return new JsonPrimitive(f.toString()); } } |
und DoubleSerializer analog.