Java的JSON处理

Java的JSON处理

用于 JSON 处理的 Java API(JSON-P)提供可移植的 API,以使用对象模型和流式 API 来解析,生成,转换和查询 JSON。 JSON-P 中使用 JSON 的两种方式有两种:流式 API 和对象模型 API。

  1. JSON-P 流式 API

    流式 API 将解析和生成控制移交给程序员。 流式 API 提供了基于事件的解析器,并允许应用开发人员请求下一个事件,而不是在回调中处理该事件。 这称为拉方法。

    名称 描述
    Json 包含用于创建 JSON 解析器,生成器及其工厂的静态方法。
    JsonParser 表示一个基于事件的解析器,它从流中读取 JSON 数据。
    JsonGenerator 将 JSON 数据一次写入一个值。
  2. JSON-P 对象模型 API

    对象模型 API 创建一个树形结构,表示内存中的 JSON 数据。 可以灵活地导航和查询树。 另一方面,对象模型 API 的效率通常不如流模型,并且需要更多的内存。

    名称 描述
    Json 包含用于创建 JSON 解析器,生成器及其工厂的静态方法。
    JsonObjectBuilder 通过添加应用代码中的值在内存中创建对象模型。
    JsonArrayBuilder 通过添加应用代码中的值在内存中创建数组模型。
    JsonReader 从输入源读取JsonObjectJsonArray
    JsonWriter JsonObjectJsonArray写入输出源。
  3. JSON-P JsonObjectBuilder示例

    public class JsonObjectBuilderEx {
    
        public static void main(String[] args) {
    
            var born = LocalDate.of(1992, 3, 2).toString();
    
            var json = Json.createObjectBuilder()
                    .add("name", "John Doe")
                    .add("occupation", "gardener")
                    .add("born", born).build();
    
            var result = json.toString();
    
            System.out.println(result);
        }
    }
    

    createObjectBuilder()创建一个JsonObjectBuilder。 新的对将插入add()。 最后,使用build()结束字符串。

    var json = Json.createObjectBuilder()
        .add("name", "John Doe")
        .add("occupation", "gardener")
        .add("born", born).build();
    

    输出:

    {"name":"John Doe","occupation":"gardener","born":"1992-03-02"}
    

    PRETTY_PRINTING

    通过JsonGenerator.PRETTY_PRINTING配置设置,我们可以设置写入器进行漂亮的打印。

    public class JsonPrettyPrintEx {
    
        public static void main(String[] args) {
    
            var born = LocalDate.of(1992, 3, 2).toString();
    
            var json = Json.createObjectBuilder()
                    .add("name", "John Doe")
                    .add("occupation", "gardener")
                    .add("born", born).build();
    
            var config = new HashMap<String, Boolean>();
            config.put(JsonGenerator.PRETTY_PRINTING, true);
    
            var jwf = Json.createWriterFactory(config);
            var sw = new StringWriter();
    
            try (var jsonWriter = jwf.createWriter(sw)) {
    
                jsonWriter.writeObject(json);
                System.out.println(sw.toString());
            }
        }
    }
    

    配置文件被传递到JsonWriterFactory

    var config = new HashMap<String, Boolean>();
    config.put(JsonGenerator.PRETTY_PRINTING, true);
    
    var jwf = Json.createWriterFactory(config);
    

    输出:

    {
        "name": "John Doe",
        "occupation": "gardener",
        "born": "1992-03-02"
    }
    
  4. JSON-P JsonArrayBuilder

    JsonArrayBuilder是用于创建和修改JsonArray对象的构建器。

    public class JsonArrayBuilderEx {
    
        public static void main(String[] args) {
    
            var ab = Json.createArrayBuilder();
    
            var users = createUsers();
    
            users.forEach(user -> {
    
                var ob = Json.createObjectBuilder();
                ob.add("name", user.getName());
                ob.add("occupation", user.getOccupation());
                ob.add("born", user.getBorn().toString());
    
                ab.add(ob);
            });
    
            var config = new HashMap<String, Boolean>();
            config.put(JsonGenerator.PRETTY_PRINTING, true);
    
            var jwf = Json.createWriterFactory(config);
            var sw = new StringWriter();
    
            try (var jsonWriter = jwf.createWriter(sw)) {
    
                jsonWriter.writeArray(jsonArray);
    
                System.out.println(sw);
            }
        }
    
        public static List<User> createUsers() {
    
            var born1 = LocalDate.of(1992, 3, 2);
            var u1 = new User("John Doe", "gardener", born1);
    
            var born2 = LocalDate.of(1967, 11, 22);
            var u2 = new User("Brian Flemming", "teacher", born2);
    
            var born3 = LocalDate.of(1995, 4, 7);
            var u3 = new User("Lucy Black", "accountant", born3);
    
            var born4 = LocalDate.of(1972, 8, 30);
            var u4 = new User("John Doe", "gardener", born4);
    
            return List.of(u1, u2, u3, u4);
        }
    }
    

    createArrayBuilder()创建一个JsonArrayBuilder

    var ab = Json.createArrayBuilder();
    

    在此 for 循环中,我们创建 JSON 对象并将其添加到构建器中。

    users.forEach(user -> {
    
        var ob = Json.createObjectBuilder();
        ob.add("name", user.getName());
        ob.add("occupation", user.getOccupation());
        ob.add("born", user.getBorn().toString());
    
        ab.add(ob);
    });
    

    输出结果:

    [
        {
            "name": "John Doe",
            "occupation": "gardener",
            "born": "1992-03-02"
        },
        {
            "name": "Brian Flemming",
            "occupation": "teacher",
            "born": "1967-11-22"
        },
        {
            "name": "Lucy Black",
            "occupation": "accountant",
            "born": "1995-04-07"
        },
        {
            "name": "John Doe",
            "occupation": "gardener",
            "born": "1972-08-30"
        }
    ]
    
  5. JSON-P JsonParser

    JsonParser使用请求解析编程模型解析 JSON。 在此模型中,客户端代码控制线程并在处理每个元素之后调用方法next()将解析器前进到下一个状态。

    解析器生成以下事件之一:START_OBJECTEND_OBJECTSTART_ARRAYEND_ARRAYKEY_NAMEVALUE_STRINGVALUE_NUMBERVALUE_TRUEVALUE_FALSEVALUE_NULL

    解析user.josn文件

    [
      {
        "name": "John Doe",
        "occupation": "gardener",
        "born": "1992-03-02"
      },
      {
        "name": "Brian Flemming",
        "occupation": "teacher",
        "born": "1967-11-22"
      },
      {
        "name": "Lucy Black",
        "occupation": "accountant",
        "born": "1995-04-07"
      },
      {
        "name": "William Bean",
        "occupation": "pilot",
        "born": "1977-10-31"
      }
    ]
    

    我们使用 JSON-P 流式 API 解析users.json文件。

    public class JsonParserSimpleEx {
    
        public static void main(String[] args) throws FileNotFoundException {
    
            var is = new FileInputStream("src/main/resources/users.json");
    
            var factory = Json.createParserFactory(null);
            var parser = factory.createParser(is, StandardCharsets.UTF_8);
    
            if (!parser.hasNext() && parser.next() != JsonParser.Event.START_ARRAY) {
    
                return;
            }
    
            // looping over object attributes
            while (parser.hasNext()) {
    
                var event = parser.next();
    
                // starting object
                if (event == JsonParser.Event.START_OBJECT) {
    
                    while (parser.hasNext()) {
    
                        event = parser.next();
    
                        if (event == JsonParser.Event.KEY_NAME) {
    
                            var key = parser.getString();
    
                            switch (key) {
    
                                case "name":
                                    parser.next();
    
                                    System.out.printf("Name: %s%n", parser.getString());
                                    break;
    
                                case "occupation":
                                    parser.next();
    
                                    System.out.printf("Occupation: %s%n", parser.getString());
                                    break;
    
                                case "born":
                                    parser.next();
    
                                    System.out.printf("Born: %s%n%n", parser.getString());
                                    break;
                            }
                        }
                    }
                }
            }
        }
    }
    
posted @   叶晨烁  阅读(214)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示