package io.vertx.up._02.json;
import io.vertx.core.json.JsonObject;
public class JObjectInit {
public static void main(final String[] args) {
/*
* 字面量初始化
* */
final String literal = "{\"name\":\"Lang\"}";
final JsonObject data = new JsonObject(literal);
System.out.println(data.encodePrettily());
}
}
Exception in thread "main" io.vertx.core.json.DecodeException: Failed to decode: Unrecognized token 'test': was expecting 'null', 'true', 'false' or NaN
at [Source: (String)"test"; line: 1, column: 9]
at io.vertx.core.json.Json.decodeValue(Json.java:124)
at io.vertx.core.json.JsonObject.fromJson(JsonObject.java:956)
at io.vertx.core.json.JsonObject.<init>(JsonObject.java:48)
书写合法的Json数据是使用JsonObject的基础,如果开发人员不掌握这些知识,往往会因为一些小的数据格式问题,使程序变得不够健壮。是的,我们在使用JsonObject对象时,尽可能考虑到程序期望的输出结果,而不是直接使用一行:final JsonObject data = new JsonObject(literal)就完事,只有掌握了合法Json数据的写法,那么您在编写程序过程中才不会因小失大。
package io.vertx.up._02.json;
public class LiteralNotation {
public static void main(final String[] args) {
// 布尔字面量
final Boolean bool = true;
// 字符串字面量
final String str = "Hello";
// 字符字面量(Json非法)
final char character = 'Y';
// 字节字面量(Json无字节类型)
final byte bytes = 12;
// 整数字面量(Json中只支持十进制)
final int number10 = 10; // 十进制
final int number16 = 0x10; // 十六进制
final int number8 = 012; // 八进制
// 浮点数字面量(Json中不支持)
final float float1 = 1.1f;
// 长整(Json中不支持)
final long long1 = 1L;
// 短整:Java中短整和整数同字面量(隐式转换)
final short short1 = 2;
}
}
package io.vertx.up._02.json;
import io.vertx.core.json.JsonObject;
import java.util.Date;
enum StringType {
TEST1, TEST2
}
public class JObjectSet {
public static void main(final String[] args) {
/* 枚举类型 */
final JsonObject data = new JsonObject();
data.put("enum", StringType.TEST1);
/* CharSequence */
final CharSequence sequence = "Hello World";
data.put("str1", sequence);
System.out.println(data.encodePrettily());
/* Error:Date类型 */
final Date date = new Date();
data.put("date", date);
}
}
运行上述代码会看到输出:
{
"enum" : "TEST1",
"str1" : "Hello World"
}
Exception in thread "main" java.lang.IllegalStateException: Illegal type in JsonObject: class java.util.Date
at io.vertx.core.json.Json.checkAndCopy(Json.java:265)
at io.vertx.core.json.JsonObject.put(JsonObject.java:684)
at io.vertx.up._02.json.JObjectSet.main(JObjectSet.java:22)
static Object checkAndCopy(Object val, boolean copy) {
if (val == null) {
// OK
} else if (val instanceof Number && !(val instanceof BigDecimal)) {
// OK
} else if (val instanceof Boolean) {
// OK
} else if (val instanceof String) {
// OK
} else if (val instanceof Character) {
// OK
} else if (val instanceof CharSequence) {
val = val.toString();
} else if (val instanceof JsonObject) {
if (copy) {
val = ((JsonObject) val).copy();
}
} else if (val instanceof JsonArray) {
if (copy) {
val = ((JsonArray) val).copy();
}
} else if (val instanceof Map) {
if (copy) {
val = (new JsonObject((Map)val)).copy();
} else {
val = new JsonObject((Map)val);
}
} else if (val instanceof List) {
if (copy) {
val = (new JsonArray((List)val)).copy();
} else {
val = new JsonArray((List)val);
}
} else if (val instanceof byte[]) {
val = Base64.getEncoder().encodeToString((byte[])val);
} else if (val instanceof Instant) {
val = ISO_INSTANT.format((Instant) val);
} else {
throw new IllegalStateException("Illegal type in JsonObject: " + val.getClass());
}
return val;
}
package io.vertx.up._02.json;
import io.vertx.core.json.JsonObject;
public class JObjectGet {
public static void main(final String[] args) {
final JsonObject json = new JsonObject();
json.put("result", "true");
// java.lang.String cannot be cast to java.lang.Boolean
final Boolean result = json.getBoolean("result");
}
}
上边代码演示了开发过程中的常见错误,运行它会得到下边输出:
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
at io.vertx.core.json.JsonObject.getBoolean(JsonObject.java:207)
at io.vertx.up._02.json.JObjectGet.main(JObjectGet.java:9)
package io.vertx.up._02.json;
import io.vertx.core.json.JsonObject;
import io.vertx.up.util.Ut;
public class JObjectGet2 {
public static void main(final String[] args) {
/*
* 从文件中读取内容转换成JsonObject
* 示例中引用了: cn.vertxup:vertx-core:0.5-SNAPSHOT
**/
final JsonObject data = Ut.ioJObject("data/input.json");
final Integer age = data.getInteger("age");
}
}
运行上边代码会遇到同样的转型异常:
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Number
at io.vertx.core.json.JsonObject.getInteger(JsonObject.java:131)
at io.vertx.up._02.json.JObjectGet2.main(JObjectGet2.java:9)
public JsonObject mergeIn(JsonObject other){}
public JsonObject mergeIn(JsonObject other, boolean deep){}
public JsonObject mergeIn(JsonObject other, int depth){}
package io.vertx.up._02.json;
import io.vertx.core.json.JsonArray;
public class JArrayGet {
public static void main(final String[] args) {
// 数组基本
final JsonArray array = new JsonArray();
array.add(Boolean.TRUE);
array.add(12.1f);
array.add("Whether");
// 正确读取
final int length = array.size();
for (int idx = 0; idx < length; idx++) {
final Object item = array.getValue(idx);
if (item instanceof Boolean) {
System.out.println("布尔值:" + (Boolean) item);
} else if (item instanceof Float) {
System.out.println("浮点数:" + (Float) item);
} else if (item instanceof String) {
System.out.println("字符串:" + item);
}
}
// 错误遍历
for (int idx = 0; idx < length; idx++) {
final Float item = array.getFloat(idx);
}
}
}
上边代码的输出为:
布尔值:true
浮点数:12.1
字符串:Whether
Exception in thread "main" java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.Number
at io.vertx.core.json.JsonArray.getFloat(JsonArray.java:149)
at io.vertx.up._02.json.JArrayGet.main(JArrayGet.java:26)
package io.vertx.up._02.json;
import io.vertx.core.json.JsonObject;
public class IssueOne {
public static void main(final String[] args) {
final JsonObject data = new JsonObject()
.put("name", "Test");
data.put("data", data);
System.out.println(data.encodePrettily());
}
}
Exception in thread "main" java.lang.StackOverflowError
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider$Impl.<init>(DefaultSerializerProvider.java:614)
package io.vertx.up._02.json;
import io.vertx.core.json.JsonObject;
import java.util.Objects;
public class JsonIterator {
public static void main(final String[] args) {
/*
* JsonObject
*/
final JsonObject data = new JsonObject()
.put("name", "Lang")
.put("email", "lang.yu@hpe.com")
.put("age", 34);
/*
* 常用迭代
*/
data.stream()
.filter(Objects::nonNull)
.filter(entry -> Objects.nonNull(entry.getValue()))
.forEach(item -> {
if ("name".equals(item.getKey())) {
data.remove(item.getKey());
}
});
}
}
运行上述代码可以得到:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:719)
at java.util.LinkedHashMap$LinkedEntryIterator.next(LinkedHashMap.java:752)
at java.util.LinkedHashMap$LinkedEntryIterator.next(LinkedHashMap.java:750)