fastjson2
fastjson2 copied to clipboard
[BUG] Graalvm版本 构建native image后出现 无法使用JSON.toJSONString
问题描述
简要描述您碰到的问题。
使用如下代码
String pretty = JSON.toJSONString(Gcache.config, JSONWriter.Feature.PrettyFormat);
log.info("pretty:" + pretty);
得到 "pretty:{}" 实际config 对象有值,即使是空对象,如果是使用 idea debug 运行 也能得到如下字符串
{
"phone":"",
"password":"",
"acNameList":"",
"blinkerKeyList":"",
"uid":"",
"accessToken":"",
"tokenPwd":"",
"homeId":"",
"appVersion":"",
"deviceId":"",
"deviceName":"",
"osVersion":"",
"deviceList":[
],
"useNullInfo":true
}
Config.java
@Data
public class Config {
@JSONField(ordinal = 1)
private String phone = "";
@JSONField(ordinal = 2)
private String password = "";
@JSONField(ordinal = 3)
private String acNameList = "";
@JSONField(ordinal = 4)
private String blinkerKeyList = "";
@JSONField(ordinal = 5)
private String uid = "";
@JSONField(ordinal = 6)
private String accessToken = "";
@JSONField(ordinal = 7)
private String tokenPwd = "";
@JSONField(ordinal = 8)
private String homeId = "";
@JSONField(ordinal = 9)
private String appVersion = "";
@JSONField(ordinal = 10)
private String deviceId = "";
@JSONField(ordinal = 11)
private String deviceName = "";
@JSONField(ordinal = 12)
private String osVersion = "";
@JSONField(ordinal = 13)
private List<Device> deviceList = new ArrayList<>();
@JSONField(ordinal = 14)
private boolean useNullInfo = true;
}
环境信息
请填写以下信息:
- OS信息: [e.g.:win11]
- JDK信息: [e.g.:graalvm-ce-java17-22.2.0]
- 版本信息:[e.g.:Fastjson2 2.0.13.graal]
期待的正确结果
对您期望发生的结果进行清晰简洁的描述。
如果在 reflect-config.json 中添加
{
"name": "com.yxd.xiaomi2meidi.entity.Config",
"allPublicFields": true,
"allDeclaredFields": true,
"allDeclaredConstructors": true,
"allPublicConstructors": true,
"allDeclaredMethods": true,
"allPublicMethods": true
}
可以获取正确结果, 但是这样我觉得是不是太麻烦了,相当于每个实体类都要配置
似乎也没有别的好办法吧
环境信息
OS信息: Mac OS Monterey JDK信息: GraalVM 22.3.0-dev (build 17.0.5+8-LTS) 版本信息:Fastjson2 2.0.16.graal、SpringBoot 3.0.0 (RC1)
此问题仍然存在,不过可以使用agent模式将Bean自动写入reflect-config.json中,这样就不需要手动添加了
Bean:
//使用了Lombok
@Getter
@Setter
@Accessors(chain = true)
public class Admin {
private String name;
private String age;
}
自动生成的信息如下:
{
"name":"com.example.demo.entity.Admin",
"allDeclaredFields":true,
"allPublicFields":true,
"queryAllPublicMethods":true,
"methods":[
{"name":"getAge","parameterTypes":[] },
{"name":"getName","parameterTypes":[] }
]
}
测试方法:
@GetMapping("/lombok")
public Mono<String> testLombok() {
Admin admin = new Admin()
.setName("sjhdajksd")
.setAge(111 + "");
//FastJSON 2 Graalvm
return Mono.just(JSON.toJSONString(admin));
}
我先关了,这个只能这样了