#JSON的流读取器和写入器

YashanDB JDBC驱动具备对流对象进行读取解析成json的能力(流读取器)和往流对象里面写入json串的能力(流写入器)。

# 流读取器YasonParser

解析流对象(Reader或InputStream)里面包含的json字符串,通过逐步读取的方式解析出完整的json对象或者获取json中某个数据。

YasonParser对象一般通过YasonFactory类里面的如下两个方法获取:

方法 备注
createJsonTextParser(java.io.Reader) 读取Reader对象里面的json字符串来进行解析
createJsonTextValue(java.io.InputStream) 读取InputStream对象里面的json字符串来进行解析

YasonParser的操作接口如下:

方法 备注
boolean hasNext() 是否还有下一个元素
Event next() 读取下一个元素,返回值Event代表读取到的下一个元素的类型,见下面YasonParser.Event类型介绍小节
String getString() 获取当前读到的字符串,如果读到的不是key或字符串或数字则报错
boolean isIntegralNumber() 判断当前解析到的数字是否为整数,如果不是数字类型则报错
int getInt() 获取当前读到的数字的int值,如果读到的不是数字则报错
long getLong() 获取当前读到的数字的long值,如果读到的不是数字则报错
double getDouble() 获取当前读到的数字的double值,如果读到的不是数字则报错
float getFloat() 获取当前读到的数字的float值,如果读到的不是数字则报错
BigInteger getBigInteger() 获取当前读到的数字的BigInteger值,如果读到的不是数字则报错
BigDecimal getBigDecimal() 获取当前读到的数字的BigDecimal值,如果读到的不是数字则报错
YasonValue getValue() 获取当前读到的YasonValue值
YasonArray getArray() 获取当前读到的YasonArray值,如果类型不符则报错
YasonObject getObject() 获取当前读到的YasonObject值,如果类型不符则报错
void skipArray() 跳过下一个YasonArray值,类型不是YasonArray则忽略
void skipObject() 跳过下一个YasonObject值,类型不是YasonObject则忽略
void close() 关闭入参中的流,停止解析json串

# YasonParser.Event类型介绍

YasonParser.Event是一个枚举类型,用来描述YasonParser从流中解析到的当前元素的类型,有以下取值:

枚举值 含义
START_ARRAY 解析到了Array的开始符号,即json串中的左方括号[
START_OBJECT 解析到了OBJECT的开始,即json串中的左花括号{
KEY_NAME 解析到了OBJECT的key
VALUE_STRING 解析到了String类型的value
VALUE_DECIMAL 解析到了数字类型的value
VALUE_TRUE 解析到了布尔值true
VALUE_FALSE 解析到了布尔值false
VALUE_NULL 解析到了json中的null值
END_OBJECT 解析到了OBJECT的结束,即json串中的右花括号}
END_ARRAY 解析到了Array的结束,即json串中的右方括号]

# YasonParser使用示例

示例一:该示例简单演示了何如从一个json字符串包含的流对象中解析出json对象的每一个值:

        YasonFactory factory = new YasonFactory();
        String json = "{\"key1\":\"value1\",\"key2\":false,\"key3\":[\"value2\",33,true,null],\"key4\":false,\"\":23}";
        
        YasonParser parser = factory.createJsonTextParser(new StringReader(json));
        while (parser.hasNext()) {
            YasonParser.Event event = parser.next();
            System.out.println(event);
            switch (event) {
                case KEY_NAME:
                case VALUE_STRING:
                case VALUE_DECIMAL:
                    System.out.println(parser.getString());
                    break;
                case VALUE_FALSE:
                case VALUE_TRUE:
                case VALUE_NULL:
                    System.out.println(parser.getValue());
                default:
            }
        }
       
Copied!

示例二:该示例演示了何如从一个json字符串包含的流对象中解析出一个完整的json对象:

        YasonFactory factory = new YasonFactory();
        String json = "{\"key1\":\"value1\",\"key2\":false,\"key3\":[\"value2\",33,true,null],\"key4\":false,\"key5\":23}";
        YasonParser parser = factory.createJsonTextParser(new StringReader(json));
        System.out.println(parser.hasNext()); // true
        System.out.println(parser.next()); // START_OBJECT,解析json得到类型为START_OBJECT
        YasonObject object = parser.getObject(); // 直接通过getObject接口获取YasonObject对象
        
        //可以对解析出来的YasonObject进行各种操作
        System.out.println(object); // {"key1":"value1","key2":false,"key3":["value2",33,true,null],"key4":false,"key5":23}
        System.out.println(object.get("key1")); // "value1"
        System.out.println(object.get("key3").getType()); // YASON_ARRAY
        System.out.println(object.get("key3")); // ["value2",33,true,null]
       
Copied!

# 流写入器YasonGenerator

通过传入key,value或者对象的方式生成一个json串写入到流对象里面。

YasonGenerator对象一般通过YasonFactory类里面的如下两个方法获取:

方法 备注
createJsonTextGenerator(Writer var1) 创建一个往给定Writer对象里写入生成的json字符串的YasonGenerator
createJsonTextGenerator(OutputStream var1) 创建一个往给定OutputStream对象里写入生成的json字符串的YasonGenerator

YasonGenerator的操作接口如下:

方法 含义
YasonGenerator writeStartObject() 往流对象里面写一个Object的开始符,即左花括号{
YasonGenerator writeStartArray() 往流对象里面写一个Array的开始符,即左方括号[
YasonGenerator writeKey(String value) 往流对象里面写一个object的key值
YasonGenerator write(YasonValue value) 往流对象里面写一个YasonValue类型的value值
YasonGenerator write(String value) 往流对象里面写一个String类型的value值
YasonGenerator write(Number value) 往流对象里面写一个Number类型的value值(常见的int,double,BigDecimal等类型的值都可以通过该接口写入)
YasonGenerator write(boolean value) 往流对象里面写一个boolean类型的value值
YasonGenerator write(LocalDateTime value) 往流对象里面写一个LocalDateTime类型的value值
YasonGenerator write(byte[] value) 往流对象里面写一个byte[]类型的value值
YasonGenerator writeNull() 往流对象里面写一个null值
YasonGenerator writeStartObject(String key) 先写一个key,再写一个Object的开始符
YasonGenerator writeStartArray(String key) 先写一个key,再写一个Array的开始符
YasonGenerator write(String key,YasonValue value) 先写一个key,再写YasonValue类型的value值
YasonGenerator write(String key,String value) 先写一个key,再写String类型的value值
YasonGenerator write(String key,Number value) 先写一个key,再写Number类型的value值
YasonGenerator write(String key,boolean value) 先写一个key,再写boolean类型的value值
YasonGenerator write(String key,LocalDateTime value) 先写一个key,再写LocalDateTime类型的value值
YasonGenerator write(String key,byte[] value) 先写一个key,再写byte[]类型的value值
YasonGenerator writeNull(String key) 先写一个key,再写一个null值
YasonGenerator writeEnd() 写一个结束符,如果当前是未闭合的Object,就会写Object的结束符(右花括号}), 如果当前是未闭合的Array,就会写Array的结束符(右方括号]
void close() 关闭流对象
void flush() 刷新流对象

Note:

YasonGenerator的所有write方法都会返回YasonGenerator自身对象,因此在实际应用中可以链式调用。

所有write方法都应该被正确的调用,否则会抛出异常。

# YasonGenerator使用示例

示例一:该示例简单演示了如何依次写入多个值,最终生成一个json串到输出流中:

        YasonFactory factory = new YasonFactory();
        Writer writer = new StringWriter();
        YasonGenerator generator = factory.createJsonTextGenerator(writer);
        generator.writeStartObject();
        generator.writeKey("key1");
        generator.write("value");

        generator.writeKey("key2").write(2).writeKey("key3").write("value3"); // 链式调用

        generator.writeKey("key4");
         // 在一个json object中,key后面必须跟着一个value,所以必须调write去写一个value,如果此时再调writeKey方法或者writeEnd方法就会抛出异常。
        generator.write(new BigDecimal(32e2));

        YasonArray array = new YasonArray();
        array.add("arrayValue1");
        array.add(3);
        array.add(new byte[]{97,97,97});
        array.add(LocalDateTime.of(2023,8,23,15,34,56));
        generator.write("key5",array);
        generator.writeEnd();
        generator.close();
        // 写入完成,后面就可以通过writer.toString()取出生成出来的json串了
        System.out.println(writer.toString()); //{"key1":"value","key2":2,"key3":"value3","key4":3200,"key5":["arrayValue1",3,"616161","2023-08-23T15:34:56"]}
       
Copied!