Gson解析

 简单new Gson,复杂格式用new GsonBuilder().registerTypeAdapter()解析,

常见错误:

Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 3 column 17 path $.authors

修改方案:

    static class GsonError1Deserializer implements JsonDeserializer {

        @Override
        public GsonError1 deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            final JsonObject jsonObject = json.getAsJsonObject();

            final JsonElement jsonTitle = jsonObject.get("name");
            final String name = jsonTitle.getAsString();

            JsonElement jsonAuthors = jsonObject.get("authors");

            GsonError1 gsonError1 = new GsonError1();

            if (jsonAuthors.isJsonArray()) {//如果数组类型,此种情况是我们需要的
                //关于context在文章最后有简单说明
                GsonError1.AuthorsBean[] authors = context.deserialize(jsonAuthors, GsonError1.AuthorsBean[].class);
                gsonError1.setAuthors(Arrays.asList(authors));
            } else {//此种情况为无效情况
                gsonError1.setAuthors(null);
            }
            gsonError1.setName(name);
            return gsonError1;
        }
    }

    static class AuthorDeserializer implements JsonDeserializer {

        @Override
        public Object deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            final JsonObject jsonObject = json.getAsJsonObject();

            final GsonError1.AuthorsBean author = new GsonError1.AuthorsBean();
            if (jsonObject.get("id") == null && jsonObject.get("name") == null) {
                author.setId(null);
                author.setName(null);
            } else if (jsonObject.get("id") != null && jsonObject.get("name") == null){
                author.setId(jsonObject.get("id").getAsString());
                author.setName(null);
            } else if (jsonObject.get("id") == null && jsonObject.get("name") != null){
                author.setId(null);
                author.setName(jsonObject.get("name").getAsString());
            } else {
                author.setId(jsonObject.get("id").getAsString());
                author.setName(jsonObject.get("name").getAsString());
            }
            return author;
        }
    }

    public static void test3() {
        //TODO:
        String json1 = "{\n" +
                "    \"name\": \"java\",\n" +
                "    \"authors\": \"\"\n" +
                "}";
        String json = "{\n" +
                "  \"name\": \"java\",\n" +
                "  \"authors\": [\n" +
                "    {\n" +
                "      \"id\": \"1\",\n" +
                "      \"name\": \"Joshua Bloch\"\n" +
                "    },\n" +
                "    {\n" +
                "      \"id\": \"2\"\n" +
                "    }\n" +
                "  ]\n" +
                "}";

        GsonBuilder gsonBuilder = new GsonBuilder();

        //注册TypeAdapter
        gsonBuilder.registerTypeAdapter(GsonError1.class, new GsonError1Deserializer());
        gsonBuilder.registerTypeAdapter(GsonError1.AuthorsBean.class, new AuthorDeserializer());

        Gson gson = gsonBuilder.create();
        GsonError1 gsonError1 = gson.fromJson(json, GsonError1.class);

        System.out.println(gsonError1);
    }

 

        File file = new File(path + "/app/src/main/java/com/anny/protobuf/json/json.json");

        FileInputStream fis = new FileInputStream(file);
        InputStreamReader isr = new InputStreamReader(fis);
        BufferedReader br = new BufferedReader(isr);
        String line;
        StringBuffer sb = new StringBuffer();

        while ((line = br.readLine()) != null){
            sb.append(line);
        }
        fis.close();
        isr.close();
        br.close();
        System.out.println(sb.toString());

 

        //Anny 没有头的特殊数据解析
        Gson gson = new Gson();
        JsonParser jsonParser = new JsonParser();
        JsonArray jsonArray = (jsonParser).parse(sb.toString()).getAsJsonArray();
        ArrayList<GsonBean> gsonBeans = new ArrayList<>();
        for (JsonElement jsonElement: jsonArray) {
            GsonBean gsonBean = gson.fromJson(jsonElement, GsonBean.class);
            gsonBeans.add(gsonBean);
        }
        System.out.println(gsonBeans);

 

上一篇:CAS实现SSO单点登录原理


下一篇:java序列化与反序列化