Package com.bazaarvoice.jolt

Source Code of com.bazaarvoice.jolt.JsonUtilImpl

/*
* Copyright 2013 Bazaarvoice, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.bazaarvoice.jolt;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.Version;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.databind.module.SimpleModule;

import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
* Implementation of JsonUtil that allows the user to provide a configured
*  Jackson ObjectMapper.
*
* All IOExceptions are caught, wrapped with context, and rethrown as RuntimeExceptions.
*/
public class JsonUtilImpl implements JsonUtil {

    // thread safe: http://wiki.fasterxml.com/JacksonFAQThreadSafety
    private final ObjectMapper objectMapper;
    private final ObjectWriter prettyPrintWriter;

    private static final TypeReference<Map<String, Object>> mapTypeReference =
            new TypeReference<Map<String, Object>>() {};
    private static final TypeReference<List<Object>> listTypeReference =
            new TypeReference<List<Object>>() {};

    public static void configureStockJoltObjectMapper( ObjectMapper objectMapper ) {

        // All Json maps should be deserialized into LinkedHashMaps.
        SimpleModule stockModule = new SimpleModule("stockJoltMapping", new Version(1, 0, 0, null, null, null))
                .addAbstractTypeMapping( Map.class, LinkedHashMap.class );

        objectMapper.registerModule(stockModule);

        // allow the mapper to parse JSON with comments in it
        objectMapper.configure( JsonParser.Feature.ALLOW_COMMENTS, true);
    }

    /**
     * By allowing the user to provide an ObjectMapper, it can be configured with
     *  knowledge of how to marshall and un-marshall your domain objects.
     *
     * @param objectMapper a configured Jackson ObjectMapper
     */
    public JsonUtilImpl( ObjectMapper objectMapper ) {

        this.objectMapper = objectMapper == null ? new ObjectMapper() : objectMapper;

        configureStockJoltObjectMapper( this.objectMapper );
        prettyPrintWriter = this.objectMapper.writerWithDefaultPrettyPrinter();
    }

    public JsonUtilImpl() {
        this( new ObjectMapper() );
    }

    // DE-SERIALIZATION
    @Override
    public Object jsonToObject( String json ) {
        return jsonToObject( new ByteArrayInputStream( json.getBytes() ) );
    }

    @Override
    public Object jsonToObject( InputStream in ) {
        try {
            return objectMapper.readValue( in, Object.class );
        }
        catch ( IOException e ) {
            throw new RuntimeException( "Unable to load JSON object from InputStream.", e );
        }
    }

    @Override
    public Map<String, Object> jsonToMap( String json ) {
        return jsonToMap( new ByteArrayInputStream( json.getBytes() ) );
    }

    @Override
    public Map<String, Object> jsonToMap( InputStream in ) {
        try {
            return objectMapper.readValue( in, mapTypeReference );
        }
        catch ( IOException e ) {
            throw new RuntimeException( "Unable to load JSON map from InputStream.", e );
        }
    }

    @Override
    public List<Object> jsonToList( String json ) {
        return jsonToList( new ByteArrayInputStream( json.getBytes() ) );
    }

    @Override
    public List<Object> jsonToList( InputStream in ) {
        try {
            return objectMapper.readValue( in, listTypeReference );
        }
        catch ( IOException e ) {
            throw new RuntimeException( "Unable to load JSON list from InputStream.", e );
        }
    }


    @Override
    public Object filepathToObject( String filePath ) {
        try {
            FileInputStream fileInputStream = new FileInputStream( filePath );
            return jsonToObject( fileInputStream );
        }
        catch ( IOException e ) {
            throw new RuntimeException( "Unable to load JSON file from: " + filePath );
        }
    }

    @Override
    public Map<String, Object> filepathToMap( String filePath ) {
        try {
            FileInputStream fileInputStream = new FileInputStream( filePath );
            return jsonToMap( fileInputStream );
        }
        catch ( IOException e ) {
            throw new RuntimeException( "Unable to load JSON file from: " + filePath );
        }
    }

    @Override
    public List<Object> filepathToList( String filePath ) {
        try {
            FileInputStream fileInputStream = new FileInputStream( filePath );
            return jsonToList( fileInputStream );
        }
        catch ( IOException e ) {
            throw new RuntimeException( "Unable to load JSON file from: " + filePath );
        }
    }

    @Override
    public Object classpathToObject( String classPath ) {
        try {
            InputStream inputStream = this.getClass().getResourceAsStream( classPath );

            return jsonToObject( inputStream );
        }
        catch ( Exception e ) {
            throw new RuntimeException( "Unable to load JSON object from classPath : " + classPath, e );
        }
    }

    @Override
    public Map<String, Object> classpathToMap( String classPath ) {
        try {
            InputStream inputStream = this.getClass().getResourceAsStream( classPath );
            return jsonToMap( inputStream );
        }
        catch ( Exception e ) {
            throw new RuntimeException( "Unable to load JSON map from classPath : " + classPath, e );
        }
    }

    @Override
    public List<Object> classpathToList( String classPath ) {
        try {
            InputStream inputStream = this.getClass().getResourceAsStream( classPath );
            return jsonToList( inputStream );
        }
        catch ( Exception e ) {
            throw new RuntimeException( "Unable to load JSON map from classPath : " + classPath, e );
        }
    }

    @Deprecated
    @Override
    public <T> T jsonTo( InputStream in, TypeReference<T> typeRef ) {
        return streamToType(in, typeRef);
    }

    @Deprecated
    @Override
    public <T> T jsonTo( String json, TypeReference<T> typeRef ) {
        return streamToType( new ByteArrayInputStream( json.getBytes() ), typeRef );
    }

    @Override
    public <T> T stringToType( String json, TypeReference<T> typeRef ) {
        return streamToType( new ByteArrayInputStream( json.getBytes() ), typeRef );
    }

    @Override
    public <T> T stringToType( String json, Class<T> aClass ) {
        return streamToType( new ByteArrayInputStream( json.getBytes() ), aClass );
    }

    @Override
    public <T> T classpathToType( String classPath, TypeReference<T> typeRef ) {
        return streamToType( this.getClass().getResourceAsStream( classPath ), typeRef );
    }
    @Override
    public <T> T classpathToType( String classPath, Class<T> aClass ) {
        return streamToType( this.getClass().getResourceAsStream( classPath ), aClass );
    }

    @Override
    public <T> T fileToType( String filePath, TypeReference<T> typeRef ) {
        try {
            FileInputStream fileInputStream = new FileInputStream( filePath );
            return streamToType( fileInputStream, typeRef );
        }
        catch ( IOException e ) {
            throw new RuntimeException( "Unable to load JSON file from: " + filePath );
        }
    }

    @Override
    public <T> T fileToType( String filePath, Class<T> aClass ) {
        try {
            FileInputStream fileInputStream = new FileInputStream( filePath );
            return streamToType( fileInputStream, aClass );
        }
        catch ( IOException e ) {
            throw new RuntimeException( "Unable to load JSON file from: " + filePath );
        }
    }

    @Override
    public <T> T streamToType( InputStream in, TypeReference<T> typeRef ) {
        try {
            return objectMapper.readValue( in, typeRef );
        }
        catch ( IOException e ) {
            throw new RuntimeException( "Unable to load JSON object from InputStream.", e );
        }
    }

    @Override
    public <T> T streamToType( InputStream in, Class<T> aClass ) {
        try {
            return objectMapper.readValue( in, aClass );
        }
        catch ( IOException e ) {
            throw new RuntimeException( "Unable to load JSON object from InputStream.", e );
        }
    }


    // SERIALIZATION
    @Override
    public String toJsonString( Object obj ) {
        try {
            return objectMapper.writeValueAsString( obj );
        }
        catch ( IOException e ) {
            throw new RuntimeException( "Unable to serialize object : " + obj, e );
        }
    }

    @Override
    public String toPrettyJsonString( Object obj ) {
        try {
            return prettyPrintWriter.writeValueAsString( obj );
        }
        catch ( IOException e ) {
            throw new RuntimeException( "Unable to serialize object : " + obj, e );
        }
    }

    @Override
    public Object cloneJson( Object obj ) {
        String string = this.toJsonString( obj );
        return this.jsonToObject( string );
    }
}
TOP

Related Classes of com.bazaarvoice.jolt.JsonUtilImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.