美文网首页
json解析

json解析

作者: 主音King | 来源:发表于2020-09-27 14:00 被阅读0次

    gson-2.8.0

    api  'com.google.code.gson:gson:2.8.0'
    

    json转bean,json中某个字段异常不影响其他字段解析,兼容方案如下:

    public class GsonTypeAdapterFactory implements TypeAdapterFactory {
        private static final String TAG = "Gson测试T-";
        @Override
        public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
            final TypeAdapter<T> adapter = gson.getDelegateAdapter(this, type);
            return new TypeAdapter<T>() {
                @Override
                public void write(JsonWriter out, T value) throws IOException {
                    adapter.write(out, value);
                }
    
                /**
                 * 处理格式异常数据
                 * @param in 读
                 * @return 返回
                 * @throws IOException 异常捕获
                 */
                @Override
                public T read(JsonReader in) throws IOException {
                    try {
                        return adapter.read(in);
                    } catch (Throwable e) {
                        Log.d(TAG, "e: "+e.toString());
                        consumeAll(in);
                        return null;
                    }
    
                }
    
                private void consumeAll(JsonReader in) throws IOException {
                    if (in.hasNext()) {
                        JsonToken peek = in.peek();
                        if (peek == JsonToken.STRING) {
                            in.nextString();
                        } else if (peek == JsonToken.BEGIN_ARRAY) {
                            in.beginArray();
                            consumeAll(in);
                            in.endArray();
                        } else if (peek == JsonToken.BEGIN_OBJECT) {
                            in.beginObject();
                            consumeAll(in);
                            in.endObject();
                        } else if (peek == JsonToken.END_ARRAY) {
                            in.endArray();
                        } else if (peek == JsonToken.END_OBJECT) {
                            in.endObject();
                        } else if (peek == JsonToken.NUMBER) {
                            in.nextString();
                        } else if (peek == JsonToken.BOOLEAN) {
                            in.nextBoolean();
                        } else if (peek == JsonToken.NAME) {
                            in.nextName();
                            consumeAll(in);
                        } else if (peek == JsonToken.NULL) {
                            in.nextNull();
                        }
                    }
                }
            };
        }
    }
    
    

    测试demo

    public class TestBody{
        public String name;
        public int age;
        public String enName;
    
        @Override
        public String toString() {
            return "TestBody{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", enName='" + enName + '\'' +
                    '}';
        }
    }
    
    // 测试
    test3("{\"name\":\"hello\",\"age\":\"error\",\"enName\":2}",TestBody.class);
    
        private <T> T test3(String json,Class<T> clazz){
            T t = null;
            try {
                Gson gson = new GsonBuilder().registerTypeAdapterFactory(new GsonTypeAdapterFactory()).create();
                t = gson.fromJson(json,clazz);
            }catch (Exception e){
                e.printStackTrace();
            }
            if (t==null){
                Log.d(TAG, "数据为:null");// 没有采用兼容方案,会整体返回null
            }else {
                Log.d(TAG, "数据为:"+t.toString());// 采用兼容方案后,只有异常json为null,其他字段正常
            }
            return t;
        }
    

    针对

    api 'com.alibaba:fastjson:1.2.73'
    

    fastjson可以参考:https://blog.csdn.net/sbsujjbcy/article/details/50414188

    相关文章

      网友评论

          本文标题:json解析

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