Gson extend 思路

package org.rx.core.internal;

import com.google.gson.*;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import org.rx.beans.JsonObject;
import org.rx.core.Reflects;

import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.math.BigInteger;

import static org.rx.core.Contract.tryAs;

public class GsonWrapper {
    public static JsonObject wrap(com.google.gson.JsonObject obj) {
        return (JsonObject) Enhancer.create(JsonObject.class, new MethodInterceptor() {
            Gson gson = new Gson();

            @Override
            public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                switch (method.getName()) {
                    case "deepCopy":
                        return wrap(obj.deepCopy());
                    case "getJsonObject": {
                        String property = (String) args[0];
                        return wrap(obj.getAsJsonObject(property));
                    }
                    case "add": {
                        String property = (String) args[0];
                        Object value = args[1];
                        if (!tryAs(value, String.class, p -> obj.addProperty(property, p))
                                && !tryAs(value, Number.class, p -> obj.addProperty(property, p))
                                && !tryAs(value, Boolean.class, p -> obj.addProperty(property, p))) {
                            obj.add(property, gson.toJsonTree(value));
                        }
                        return null;
                    }
                    case "remove":
                        String property = (String) args[0];
                        obj.remove(property);
                        return null;
                }
                String fg = "get";
                if (method.getName().startsWith("is")) {
                    String property = (String) args[0];
                    JsonElement element = obj.get(property);
                    return Reflects.invokeMethod(element.getClass(), element, method.getName());
                } else if (method.getName().startsWith(fg)) {
                    String property = (String) args[0];
                    JsonElement element = obj.get(property);
                    return Reflects.invokeMethod(element.getClass(), element, "getAs" + method.getName().substring(fg.length()));
                }
                return methodProxy.invoke(obj, args);
            }
        });
    }
}

  

package org.rx.beans;

import com.google.gson.JsonArray;
import com.google.gson.JsonPrimitive;

import java.math.BigDecimal;
import java.math.BigInteger;

public interface JsonObject {
    JsonObject deepCopy();

    int size();

    boolean has(String property);

    void add(String property, Object value);

    void remove(String property);

    boolean isJsonArray(String property);

    boolean isJsonObject(String property);

    boolean isJsonPrimitive(String property);

    boolean isJsonNull(String property);

    JsonObject getJsonObject(String property);

    JsonArray getJsonArray(String property);

    JsonPrimitive getJsonPrimitive(String property);

    boolean getBoolean(String property);

    Number getNumber(String property);

    String getString(String property);

    double getDouble(String property);

    float getFloat(String property);

    long getLong(String property);

    int getInt(String property);

    byte getByte(String property);

    BigDecimal getBigDecimal(String property);

    BigInteger getBigInteger(String property);

    short getShort(String property);
}

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值