有了它,就可以实现我们的自动绑定了,书写测试用例:
【json格式转换文本的方法 jsonobject解析json字符串特别慢】@Testpublic void test3() throws IOException {String jsonStr = "{"name":"YourBatman","age":18, "pickName":null}";JsonFactory factory = new JsonFactory();try (JsonParser jsonParser = factory.createParser(jsonStr)) {jsonParser.setCodec(new PersonObjectCodec());System.out.println(jsonParser.readValueAs(Person.class));}}运行程序,输出:
Person(name=YourBatman, age=18)这就是 ObjectMapper 自动绑定的核心原理所在,其它更为强大能力将在后续章节详细展开 。
JsonToken在上例解析过程中,有一个非常重要的角色,那便是:JsonToken 。它表示解析 JSON 内容时,用于返回结果的基本标记类型的枚举 。
public enum JsonToken {NOT_AVAILABLE(null, JsonTokenId.ID_NOT_AVAILABLE),START_OBJECT("{", JsonTokenId.ID_START_OBJECT),END_OBJECT("}", JsonTokenId.ID_END_OBJECT),START_ARRAY("[", JsonTokenId.ID_START_ARRAY),END_ARRAY("]", JsonTokenId.ID_END_ARRAY),// 属性名(key)FIELD_NAME(null, JsonTokenId.ID_FIELD_NAME),// 值(value)VALUE_EMBEDDED_OBJECT(null, JsonTokenId.ID_EMBEDDED_OBJECT),VALUE_STRING(null, JsonTokenId.ID_STRING),VALUE_NUMBER_INT(null, JsonTokenId.ID_NUMBER_INT),VALUE_NUMBER_FLOAT(null, JsonTokenId.ID_NUMBER_FLOAT),VALUE_TRUE("true", JsonTokenId.ID_TRUE),VALUE_FALSE("false", JsonTokenId.ID_FALSE),VALUE_NULL("null", JsonTokenId.ID_NULL),}为了辅助理解,A 哥用一个例子,输出各个部分一目了然:
@Testpublic void test2() throws IOException {String jsonStr = "{"name":"YourBatman","age":18, "pickName":null}";System.out.println(jsonStr);JsonFactory factory = new JsonFactory();try (JsonParser jsonParser = factory.createParser(jsonStr)) {while (true) {JsonToken token = jsonParser.nextToken();System.out.println(token" -> 值为:"jsonParser.getValueAsString());if (token == JsonToken.END_OBJECT) {break;}}}}运行程序,输出:
{"name":"YourBatman","age":18, "pickName":null}START_OBJECT -> 值为:nullFIELD_NAME -> 值为:nameVALUE_STRING -> 值为:YourBatmanFIELD_NAME -> 值为:ageVALUE_NUMBER_INT -> 值为:18FIELD_NAME -> 值为:pickNameVALUE_NULL -> 值为:nullEND_OBJECT -> 值为:null从左至右解析,一一对应 。各个部分用下面这张图可以简略表示出来:
小贴士:解析时请确保你的的 JSON 串是合法的,否则抛出JsonParseException异常JsonParser 的 Feature它是 JsonParser 的一个内部枚举类,共 15 个枚举值:
public enum Feature {AUTO_CLOSE_SOURCE(true),ALLOW_COMMENTS(false),ALLOW_YAML_COMMENTS(false),ALLOW_UNQUOTED_FIELD_NAMES(false),ALLOW_SINGLE_QUOTES(false),@DeprecatedALLOW_UNQUOTED_CONTROL_CHARS(false),@DeprecatedALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER(false),@DeprecatedALLOW_NUMERIC_LEADING_ZEROS(false),@DeprecatedALLOW_LEADING_DECIMAL_POINT_FOR_NUMBERS(false),@DeprecatedALLOW_NON_NUMERIC_NUMBERS(false),@DeprecatedALLOW_MISSING_VALUES(false),@DeprecatedALLOW_TRAILING_COMMA(false),STRICT_DUPLICATE_DETECTION(false),IGNORE_UNDEFINED(false),INCLUDE_SOURCE_IN_LOCATION(true);}小贴士:枚举值均为 bool 类型,括号内为默认值每个枚举值都控制着JsonParser不同的行为 。下面分类进行解释
底层 I/O 流相关
自 2.10 版本后,使用StreamReadFeature#AUTO_CLOSE_SOURCE代替Jackson 的流式 API 指的是 I/O 流,所以即使是读,底层也是用 I/O 流(Reader)去读取然后解析的 。
AUTO
- 我来分享MP3视频转换器的简单使用过程。
- 实施细则格式及范本 实施细则属于规范性文件吗?
- rs485用什么线,rs485转换器连接线需要什么线电线可以吗
- 教你将腾讯视频qlv格式转换成mp4的方法讲解。
- 我来教你格式工厂剪辑视频的图文教程。
- 小编教你苹果手机keynote怎样转换成ppt。
- PPT格式转换有技巧,不看可惜了!
- 小编分享iOS15相册怎样显示照片格式。
- 小编教你格式工厂压缩音频文件的详细操作
- Pat格式 pat是什么格式
