All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.ejlchina.data.JacksonDataConvertor Maven / Gradle / Ivy

package com.ejlchina.data;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.type.CollectionType;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Type;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class JacksonDataConvertor implements DataConvertor {

	private ObjectMapper objectMapper;

	private final Map> cache = new HashMap<>();

	private boolean typeCached;

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

	public JacksonDataConvertor(ObjectMapper objectMapper) {
		this(objectMapper, false);
	}

	public JacksonDataConvertor(ObjectMapper objectMapper, boolean typeCached) {
		this.objectMapper = objectMapper;
		this.typeCached = typeCached;
	}

	@Override
	public Mapper toMapper(InputStream in, Charset charset) {
		try {
			JsonNode json = objectMapper.readTree(new InputStreamReader(in, charset));
			if (json.isObject()) {
				return new JacksonMapper((ObjectNode) json);
			}
			if (json.isNull() || json.isMissingNode()) {
				return null;
			}
			throw new IllegalStateException("不是 一个 json 对象:" + json);
		} catch (IOException e) {
			throw new IllegalStateException("Jackson 解析异常", e);
		}
	}

	@Override
	public Array toArray(InputStream in, Charset charset) {
		try {
			JsonNode json = objectMapper.readTree(new InputStreamReader(in, charset));
			if (json.isArray()) {
				return new JacksonArray((ArrayNode) json);
			}
			if (json.isNull() || json.isMissingNode()) {
				return null;
			}
			throw new IllegalStateException("不是 一个 json 数组:" + json);
		} catch (IOException e) {
			throw new IllegalStateException("Jackson 解析异常", e);
		}
	}

	@Override
	public byte[] serialize(Object object, Charset charset) {
		if (object instanceof JacksonMapper || object instanceof JacksonArray) {
			return object.toString().getBytes(charset);
		}
		try {
			return objectMapper.writeValueAsString(object).getBytes(charset);
		} catch (JsonProcessingException e) {
			throw new IllegalStateException("Java Bean [" + object + "] Jackson 序列化异常", e);
		}
	}

	protected  TypeReference toTypeRef(Type type) {
		TypeReference typeRef;
		synchronized (cache) {
			//noinspection unchecked
			typeRef = (TypeReference) cache.get(type);
			if (typeRef == null) {
				typeRef = new TypeReference() {
					@Override
					public Type getType() {
						return type;
					}
				};
				if (typeCached) {
					cache.put(type, typeRef);
				}
			}
		}
		return typeRef;
	}

	@Override
	public  T toBean(Type type, InputStream in, Charset charset) {
		try {
			return objectMapper.readValue(new InputStreamReader(in, charset), toTypeRef(type));
		} catch (IOException e) {
			throw new IllegalStateException("Jackson 解析异常", e);
		}
	}

	@Override
	public  List toList(Class type, InputStream in, Charset charset) {
		CollectionType javaType = objectMapper.getTypeFactory().constructCollectionType(ArrayList.class, type);
		try {
			return objectMapper.readValue(new InputStreamReader(in, charset), javaType);
		} catch (IOException e) {
			throw new IllegalStateException("Jackson 解析异常", e);
		}
	}

	public ObjectMapper getObjectMapper() {
		return objectMapper;
	}

	public void setObjectMapper(ObjectMapper objectMapper) {
		this.objectMapper = objectMapper;
	}

	public boolean isTypeCached() {
		return typeCached;
	}

	public void setTypeCached(boolean typeCached) {
		this.typeCached = typeCached;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy