package com.jsoniter.output; import com.jsoniter.any.Any; import com.jsoniter.spi.Encoder; import com.jsoniter.spi.TypeLiteral; import java.io.IOException; import java.lang.reflect.Type; import java.util.HashMap; import java.util.Map; class ReflectionMapEncoder implements Encoder { private final TypeLiteral valueTypeLiteral; public ReflectionMapEncoder(Class clazz, Type[] typeArgs) { if (typeArgs.length > 1) { valueTypeLiteral = TypeLiteral.create(typeArgs[1]); } else { valueTypeLiteral = TypeLiteral.create(Object.class); } } @Override public void encode(Object obj, JsonStream stream) throws IOException { if (obj == null) { stream.writeNull(); return; } Map<String, Object> map = (Map<String, Object>) obj; stream.writeObjectStart(); boolean notFirst = false; for (Map.Entry<String, Object> entry : map.entrySet()) { if (notFirst) { stream.writeMore(); } else { notFirst = true; } stream.writeObjectField(entry.getKey()); stream.writeVal(valueTypeLiteral, entry.getValue()); } stream.writeObjectEnd(); } @Override public Any wrap(Object obj) { Map<String, Object> map = (Map<String, Object>) obj; return Any.wrap(map); } }