📜  com.google.gson.stream.MalformedJsonException:使用 JsonReader.setLenient(true) 接受格式错误的 JSON - Javascript (1)

📅  最后修改于: 2023-12-03 15:30:03.783000             🧑  作者: Mango

使用 JsonReader.setLenient(true) 接受格式错误的 JSON

简介

在处理 JSON 数据时,往往需要使用 JSON 解析器来将 JSON 字符串转换为对象。但是,JSON 数据经常存在格式不规范的情况,比如:缺少引号、缺少逗号、多余的括号等等。这时候,JSON 解析器就会抛出异常,导致程序执行失败。

例如,在使用 Google Gson 解析 JSON 数据时,可能会遇到以下异常:

com.google.gson.stream.MalformedJsonException: 
    Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 6 path $

这个异常表示 JSON 数据格式不正确,可以通过设置 JsonReader 的 lenient 属性为 true 来接受格式不规范的 JSON。

示例代码

以下示例代码演示了如何使用 Google Gson 解析 JSON 数据并处理格式不规范的情况:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.MalformedJsonException;
import java.io.IOException;
import java.io.StringReader;

public class GsonExample {

    public static void main(String[] args) {
        String json = "{\"name\": \"John\", age: 30, \"city\": \"New York\"}";

        Gson gson = new GsonBuilder().create();

        try {
            // 解析 JSON 数据
            MyObject obj = gson.fromJson(json, MyObject.class);
            System.out.println(obj);

        } catch (MalformedJsonException e) {
            // 格式不规范的 JSON 数据
            System.out.println("JSON 数据格式不正确:" + e.getMessage());

            try {
                // 接受格式不规范的 JSON 数据
                JsonReader reader = new JsonReader(new StringReader(json));
                reader.setLenient(true);

                MyObject obj = gson.fromJson(reader, MyObject.class);
                System.out.println(obj);

            } catch (IOException ex) {
                System.out.println("JSON 数据解析失败:" + ex.getMessage());
            }
        }
    }

    public static class MyObject {
        private String name;
        private int age;
        private String city;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        public String getCity() {
            return city;
        }

        public void setCity(String city) {
            this.city = city;
        }

        @Override
        public String toString() {
            return "MyObject{name='" + name + "', age=" + age + ", city='" + city + "'}";
        }
    }
}
参考链接