在调试一段将字符串转换为对象的代码时,我意识到JSON解析使用的是toString表示,而不是对象的JSON表示。
Pojo:
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class Pojo {
int a;
String b;
}
解析逻辑:
Gson gsonInstance =
new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.setDateFormat("yyyy-MM-dd")
.create();
String json2 = "{a=5, b=field}";
Pojo obj = gsonInstance.fromJson(json2, Pojo.class);
System.out.println(obj);
当我向Pojo添加包含“:“的字段时,这开始被打破。就像约会一样。
围绕这两个问题:1)Gson是如何支持这一点的?我找不到任何医生同样的2)如何处理我前面提到的与toString实现有关的日期问题?我试着在Java中转义字符串,但没有帮助。
2条答案
按热度按时间uqzxnwby1#
这是Gson的一个特性,它实际上是有文档记录的,但文档有点隐藏。参考:Gson.java。JSON标准化的最终调用是
public <T> T fromJson(JsonReader reader, Type typeOfT) throws JsonIOException, JsonSyntaxException
在代码的主体中,请参考:
现在参考JsonReader.java
方法的javadoc声明如下:
/* 将此解析器配置为接受自由的解析器。默认情况下,* 这个解析器是严格的,只接受RFC 4627指定的JSON。将 * parser设置为lenient会导致它忽略以下语法错误:- -
")]}'\n"
开头的流。*以上就是Gson解析你的字符串并将其解析的原因。
如果你的名字/值(未加引号)有任何“:”,上面的代码将不起作用,原因是Gson将(在你的情况下)解释为name=[value或anotherName???]:value(Gson没有那么宽松)。
使用正确有效的JSON并反序列化。
hzbexzde2#
您需要一个启用了复杂Map键序列化的Gson。
https://www.javadoc.io/doc/com.google.code.gson/gson/latest/com.google.gson/com/google/gson/GsonBuilder.html#enableComplexMapKeySerialization()