Java组装json

Java组装json,零侵入,自定义实现。

​

/**
 * @author zhangshiqiang on 2019/10/24.
 */
public interface IFieldAssembleJson {
    /**
     * 组装各种数据类型的json体
     *
     * @param sb
     * @param fieldName
     * @param value
     * @return
     */
    StringBuilder assemble(StringBuilder sb, String fieldName, Object value);
}
/**
 * @author zhangshiqiang on 2019/10/24.
 */
public class NumberField implements IFieldAssembleJson {


    @Override
    public StringBuilder assemble(StringBuilder sb, String fieldName, Object value) {
        return sb.append('"')
                .append(fieldName)
                .append('"')
                .append(':')
                .append(value)
                ;
    }
}
/**
 * @author zhangshiqiang on 2019/10/24.
 */
public class StringField implements IFieldAssembleJson {
    @Override
    public StringBuilder assemble(StringBuilder sb, String fieldName, Object value) {
        return sb.append('"')
                .append(fieldName)
                .append('"')
                .append(':')
                .append('"')
                .append(value)
                .append('"')
                ;
    }
}
/**
 * @author zhangshiqiang on 2019/10/24.
 */
public class FieldAssembleJsonUtil {


    private static Map<Class<?>, IFieldAssembleJson> map = new HashMap<>();


    static {
        // 公用一个
        NumberField numberField = new NumberField();
        map.put(int.class, numberField);
        map.put(Integer.class, numberField);
        map.put(short.class, numberField);
        map.put(Short.class, numberField);
        map.put(byte.class, numberField);
        map.put(Byte.class, numberField);
        map.put(long.class, numberField);
        map.put(Long.class, numberField);
        map.put(String.class, new StringField());
    }


    public static void process(StringBuilder sb,
                               String fieldName,
                               Object value) {
        Class<?> clazz = value.getClass();
        if (map.get(clazz) == null) {
            throw new RuntimeException("暂未支持此数据类型");
        }
        map.get(clazz).assemble(sb, fieldName, value);
    }
}
/**
 * @author zhangshiqiang on 2019/10/24.
 */
public class ClassUtil {


    /**
     * 暂时只支持基础数据类型与String数据类型 TODO
     *
     * @param t
     * @param <T>
     * @return
     */
    public static <T> String toJson(T t) {
        StringBuilder sb = new StringBuilder();
        sb.append('{');


        Field[] declaredFields = t.getClass().getDeclaredFields();


        int i = 0;


        for (Field declaredField : declaredFields) {
            declaredField.setAccessible(true);
            Object obj = null;
            try {
                obj = declaredField.get(t);
            } catch (IllegalAccessException e) {
                // ignore
            }


            if (obj == null || "null".equals(obj.toString())) {
                continue;
            }


            if (i++ > 0) {
                sb.append(',');
            }
            String fieldName = declaredField.getName();
            // 拼接 json
            FieldAssembleJsonUtil.process(sb, fieldName, obj);
        }


        sb.append('}');


        return sb.toString();
    }
}

猜你喜欢

转载自blog.csdn.net/now19930616/article/details/102736169