com.solidbeans.core.util.Json.java Source code

Java tutorial

Introduction

Here is the source code for com.solidbeans.core.util.Json.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.solidbeans.core.util;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.util.Objects;

/**
 * A JSON implementation wrapper.
 *
 * @author magnus.wahlstrom@solidbeans.com
 */
public final class Json {

    public static class TypeAdapter<TA> {

        private Class<TA> classOfTA;
        private TA objectOfTA;

        private TypeAdapter(Class<TA> classOfTA, TA objectOfTA) {
            this.classOfTA = classOfTA;
            this.objectOfTA = objectOfTA;
        }

        public static <TA> TypeAdapter<TA> createTypeAdapter(Class<TA> classOfTA, TA objectOfTA) {
            return new TypeAdapter<>(classOfTA, objectOfTA);
        }

        public Class<TA> getClassOfTA() {
            return classOfTA;
        }

        public TA getObjectOfTA() {
            return objectOfTA;
        }
    }

    private final Gson gson = new Gson();

    Json() {
    }

    /**
     * Transform object to JSON using underlying implementation.
     *
     * @param data Object to transform into JSON
     * @param <T> Type of object to transform
     * @return JSON string
     */
    public <T> String toJson(T data) {
        return gson.toJson(data);
    }

    /**
     * Transform JSON to object using underlying implementation.
     *
     * @param json JSON string
     * @param classOfT Class definition of object to create
     * @param <T> Type of object to create
     * @return Transformed object from JSON
     */
    public <T> T fromJson(String json, Class<T> classOfT) {
        return gson.fromJson(json, classOfT);
    }

    /**
     * Transform JSON to object using underlying implementation. Registers type adapters that handles sub types in JSON.
     *
     * @param json JSON string
     * @param classOfT Class definition of object to create
     * @param adapters Adapters to register
     * @param <T> Type of object to create
     * @return Transformed object from JSON
     */
    public <T> T fromJson(String json, Class<T> classOfT, TypeAdapter<?>... adapters) {
        GsonBuilder builder = new GsonBuilder();

        if (Objects.nonNull(adapters)) {
            for (TypeAdapter<?> adapter : adapters) {
                builder.registerTypeAdapter(adapter.getClassOfTA(), adapter.getObjectOfTA());
            }
        }

        return builder.create().fromJson(json, classOfT);
    }
}