美文网首页
自定义Gson处理器

自定义Gson处理器

作者: 刘书生 | 来源:发表于2019-11-08 09:58 被阅读0次

    1.介绍

    Gson是一个Java库,可用于将Java对象转换为其JSON表示形式。它还可以用于将JSON字符串转换为等效的Java对象。Gson可以处理任意Java对象,包括您没有源代码的现有对象。

    2.参考链接

    gitup:https://github.com/google/gson

    3.在java工程中的引入

    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.5</version>
    </dependency>
    

    4.编写解析器

    package net.bingosoft.egw.oapi.tunnel.jsonify;
    
    import com.google.gson.TypeAdapter;
    import com.google.gson.stream.JsonReader;
    import com.google.gson.stream.JsonWriter;
    import io.netty.buffer.ByteBuf;
    import io.netty.buffer.Unpooled;
    import io.netty.handler.codec.http.*;
    import lombok.var;
    import org.apache.commons.lang3.StringUtils;
    
    import java.io.IOException;
    import java.util.Base64;
    
    public class FullRequestAdapter extends TypeAdapter<FullHttpRequest> {
        @Override
        public void write(JsonWriter out, FullHttpRequest value) throws IOException {
            out.beginObject();
    
            out.name("protocol").value(value.protocolVersion().protocolName());
            out.name("method").value(value.method().name());
            out.name("uri").value(value.uri());
            out.name("headers");
            out.beginObject();
            for (var headerName : value.headers().names()) {
                out.name(headerName);
                out.beginArray();
                for (var headerValue : value.headers().getAll(headerName)) {
                    out.value(headerValue);
                }
                out.endArray();
            }
            out.endObject();
    
            var contentType = value.headers().get(HttpHeaderNames.CONTENT_TYPE);
            if (value.content().readableBytes() > 0) {
                out.name("body");
    
                var buf = new byte[value.content().readableBytes()];
                value.content().readBytes(buf);
                if(!(StringUtils.contains(contentType,"text")||StringUtils.contains(contentType,"application"))){
                    out.value(Base64.getEncoder().encodeToString(buf));
                }else{
                    out.value(new String(buf));
                }
                buf = null;
            }
            out.endObject();
        }
    
        @Override
        public FullHttpRequest read(JsonReader in) throws IOException {
            HttpVersion protocolVersion = null;
            HttpMethod method = null;
            String uri = null;
            DefaultHttpHeaders headers = new DefaultHttpHeaders();
            ByteBuf body = null;
    
            in.beginObject();
            while(in.hasNext()) {
                switch (in.nextName()) {
                    case "protocol":
                        protocolVersion = HttpVersion.valueOf(in.nextString());
                        break;
                    case "method":
                        method = HttpMethod.valueOf(in.nextString());
                        break;
                    case "uri":
                        uri = in.nextString();
                        break;
                    case "headers":
                        in.beginObject();
                        while(in.hasNext()) {
                            var headerName = in.nextName();
                            in.beginArray();
                            while(in.hasNext()) {
                                headers.add(headerName, in.nextString());
                            }
                            in.endArray();
                        }
                        in.endObject();
                        break;
                    case "body":
                        var contentType = headers.get(HttpHeaderNames.CONTENT_TYPE);
                        if(!(StringUtils.contains(contentType,"text")||StringUtils.contains(contentType,"application"))){
                            body = Unpooled.wrappedBuffer(Base64.getDecoder().decode(in.nextString()));
                        }else{
                            body = Unpooled.wrappedBuffer(in.nextString().getBytes());
                        }
                        break;
                }
            }
    
            return new DefaultFullHttpRequest(protocolVersion, method, uri, body, headers, new DefaultHttpHeaders());
        }
    }
    

    5.编写完后如何使用?

    • 注册
    private Gson gson = new GsonBuilder()
                .registerTypeAdapter(FullHttpRequest.class, new FullRequestAdapter())
                .create();
    
    • 使用
    var jsonString = gson.toJson(new DefaultFullHttpRequest(request.protocolVersion(),
                    request.method(),
                    request.uri(),
                    requestBody,
                    request.headers(),
                    new DefaultHttpHeaders()));
    
    gson.fromJson(gson.toJson(responseBody), FullHttpResponse.class);
    

    相关文章

      网友评论

          本文标题:自定义Gson处理器

          本文链接:https://www.haomeiwen.com/subject/jzkibctx.html