Maps mittels GSON deserialisieren

GSON ist eine von Google entwickelte Java-Bibliothek, welche ursprünglich für den internen Gebrauch bei Google gedacht war. Mit dieser ist, neben vielen anderen Dingen, unter anderem die Serialisierung von Java-Objekten in JSON möglich. Gegeben sei für ein kleines Beispiel die Klasse FooObject:

public class FooObject {

    private int id;
    private String key;
    private String value;

    public FooObject(int id, String key, String value) {
        this.id = id;
        this.key = key;
        this.value = value;
    }

    public int getId() {
        return id;
    }

    public String getKey() {
        return key;
    }

    public String getValue() {
        return value;
    }
}

Die Klasse besteht aus drei internen Variablen, welche eine Id, einen Key und einen Value halten. Daneben existieren ein Konstruktor und drei Getter-Methoden für die Rückgabe der internen Variablen. Mithilfe von GSON kann eine Instanz der Klasse einfach zu JSON serialisiert werden:

Gson gson = new Gson();
FooObject fooObject = new FooObject(1, "keyA", "valueA");
String jsonFooObject = gson.toJson(fooObject);

Heraus kommt bei dieser Serialisierung folgendes JSON-Objekt:

{
   "id":1,
   "key":"keyA",
   "value":"valueA"
}

Auch die Deserialisierung des Objektes mittels GSON ist kein Problem:

fooObject = gson.fromJson(jsonFooObject, FooObject.class);

Interessanter und komplizierter wird es, wenn Maps mittels GSON serialisiert werden sollen:

Map values = new HashMap<>();
values.put("A", new FooObject(1, "keyA", "valueA"));
values.put("B", new FooObject(2, "keyB", "valueB"));
values.put("C", new FooObject(3, "keyC", "valueC"));

Die Serialisierung gestaltet sich noch einfach:

String json = gson.toJson(values);

Bei der Deserialisierung mittels:

Map map = gson.fromJson(json, Map.class);

erhält der Nutzer allerdings eine LinkedTreeMap. Auf die Werte der Map kann durchaus zugegriffen werden:

String value = map.get("A").get("key");

Allerdings schlägt die Umwandlung in ein Objekt vom Typ FooObject fehl:

FooObject fooObjectB = map.get("A");

Stattdessen erhält der Nutzer eine ClassCastException:

Exception in thread "main" java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to org.example.console.FooObject

Damit der Cast gelingt muss bei der Deserialisierung der Map anders gearbeitet werden:

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;

...

Type type = new TypeToken>(){}.getType();
Map map = gson.fromJson(json, type);

Damit kann die Map mit dem FooObject normal genutzt werden. Mithilfe des TypeTokens kann ein generischer Typ repräsentiert und somit für die Deserialisierung mittels GSON eingesetzt werden.

A.I. DUET

Google veröffentlicht von Zeit zu Zeit ein paar seiner Experimente im Zusammenhang mit künstlicher Intelligenz. Eines dieser Experimente ist A.I. DUET. In der Webapp wird dem Nutzer ein virtuelles Klavier angeboten, auf welchem dieser ein paar Noten spielen kann. Alternativ kann ein Keyboard mittels MIDI-Interface angeschlossen werden. Nachdem der Nutzer einige Noten gespielt hat, antworte das trainierte neuronale Netz mit eigenen Noten; so kann der Nutzer in einer Art Duett mit dem neuronalen Netzwerk interagieren.

A.I. DUET in Aktion

Zu finden ist das Experiment unter experiments.withgoogle.com. Der Quelltext kann über GitHub bezogen werden. Lizenziert ist A.I. DUET unter der Apache License in Version 2 und damit freie Software.

Buchscanner im Eigenbau

Ein professioneller Buchscanner kann problemlos für fünf- bis sechstellige Beträge erworben werden. Allerdings lassen sich Buchscanner auch im Eigenbau herstellen. Einwickelt wird ein solcher Scanner vom Verein mäqädat – Bildung ohne Grenzen e.V. Ziel des Vereines ist es einen günstigen und einfach zu bauenden Scanner zu erstellen. Gebaut wird der Scanner für Universitäten in Athopien, welche zu wenige Lehrbücher anschaffen können, da die Kosten für diese Bücher zu hoch sind. Ein Buchscanner soll dieses Problem entschärfen, indem die Bücher kostengünstig digitalisiert werden können.

Eine günstige Möglichkeit zur Digitalisierung von Büchern soll geschaffen werden

Technisch basiert der Scanner in seinen ersten Versionen auf dem Linear Book Scanner von Google, hat sich allerdings mittlerweile weiterentwickelt. In Bereich Downloads auf der Seite sind die bisherigen Baupläne der aktuellen Version zu finden. Einige Teile fehlen in diesen Bauplänen allerdings noch, so z.B. die Raspberry Pi-Firmware.

Quellcode-Formatierung unter WordPress

Wenn Quelltext in einem WordPress-Beitrag untergebracht wird, so ist dieser in einem pre-Block meist relativ unansehnlich. Im Plugin-Verzeichnis existieren für dieses Problem eine Reihe von Plugins, welche sich der Codeformatierung annehmen.

Mithilfe einer modifizierten Version der Google-Bibliothek code-prettify wird der Quelltext eingefärbt

Problematisch an diesen Plugins ist allerdings, dass der Nutzer in meisten Fällen alle Beiträge entsprechend anpassen muss. Bei einigen Beiträgen mag dies noch funktionieren, aber bei einigen tausenden Beiträgen ist dies relativ unpraktisch. Abhilfe schafft hier das Plugin Code Prettify von Kaspars Dambis.

Code Prettify
Preis: Kostenlos

Mithilfe einer modifizierten Version der Google-Bibliothek code-prettify wird der Quelltext eingefärbt. Alle pre-Blöcke werden entsprechend behandelt und dies führt zu einem ansehnlicheren Quelltext:

public int doFooBar() {
    int prime = generatePrime();
    return prime * 3.14;
}

Die Entwicklung des Plugins findet auf GitHub statt. Lizenziert ist Code Prettify unter der Apache License in der Version 2 und damit freie Software.

Nachkommastellen von Pi als REST-Service

Die Zahl Pi beschreibt das Verhältnis des Umfangs eines Kreises zu seinem Durchmesser und gehört sicherlich zu den bekannteren mathematischen Konstanten. Anlässlich des Pi-Days am 14. März 2019 veröffentlichte Google die Zahl Pi mit bisher unerreichten 31,4 Billionen Nachkommastellen.

3.1415926535897…

Passend dazu stellte Google die Seite pi.delivery in Netz. Neben einigen Spielereien rund um Pi, wie die Nutzung von Pi zur Generierung von Musik, findet sich dort eine REST-API, mit welcher die Nachkommastellen von Pi erfragt werden können. Ein einfacher Request des Services sieht wie folgt aus:

GET https://api.pi.delivery/v1/pi?start=0&numberOfDigits=42

Für den Request existieren zwei Parameter. Der erste Parameter mit dem Namen start definiert ab welcher Stelle die Nachkommastellen geliefert werden sollen. Der zweite Parameter numberOfDigits setzt die Anzahl der zurückgelieferten Nachkommastellen. Als Antwort erhält der Nutzer des Service anschließend die entsprechenden Nachkommastellen (sowie die 3 am Anfang von Pi):

{
    "content": "314159265358979323846264338327950288419716"
}