提问人:edward 提问时间:6/10/2023 最后编辑:OneCricketeeredward 更新时间:6/12/2023 访问量:241
如何在不使用任何外部库或依赖项的情况下将 java 对象转换为 JSON 格式?
How do I convert a java object toJSON format without using any external libraries or dependencies for java?
问:
static class DataObject {
private String access;
private String foo;
private Int age;
}
自{"access" : "value","foo":"value","age":"value"}
不使用 Gson 或 jackson。只是香草爪哇
有没有更简单的方法?
答:
1赞
OneCricketeer
6/10/2023
#1
从 Java 20 开始,JRE 中仍然没有包含 JSON API。
因此,您的答案是自己编写 String,例如使用String.format
关于您的类结构,您可以使用记录。
0赞
Reilas
6/10/2023
#2
要动态地做到这一点,很可能需要递归,我想还需要反思。
对于静态内容,一个简单的实现是利用 toString 方法。
下面是一个示例,给定您在评论中提供的数据。
这里的 Formatter 类只是对 String#format 方法的扩展。
特别是,它与 JSON 解析没有关联。
class DataObject {
String aPid;
String location;
String senderDomainId;
String timeZone;
String senderDomainAgentId;
String recipientDomainName;
BusinessMsg businessMsg;
@Override
public String toString() {
StringBuilder string = new StringBuilder();
Formatter formatter = new Formatter(string);
formatter.format("{%n");
formatter.format("\"sendParams\": {".indent(4), aPid);
formatter.format("\"aPid\": \"%s\",".indent(8), aPid);
formatter.format("\"location\": \"%s\",".indent(8), location);
formatter.format("\"senderDomainId\": \"%s\",".indent(8), senderDomainId);
formatter.format("\"timeZone\": \"%s\",".indent(8), timeZone);
formatter.format("\"senderDomainAgentId\": \"%s\",".indent(8), senderDomainAgentId);
formatter.format("\"recipientDomainName\": \"%s\",".indent(8), recipientDomainName);
formatter.format("\"businessMsg\": %s".indent(8), businessMsg);
formatter.format("}".indent(4));
formatter.format("}");
formatter.flush();
return string.toString();
}
static class BusinessMsg {
String id, to, from;
@Override
public String toString() {
StringBuilder string = new StringBuilder();
Formatter formatter = new Formatter(string);
formatter.format("{%n");
formatter.format("\"id\": \"%s\",".indent(12), id);
formatter.format("\"to\": \"%s\",".indent(12), to);
formatter.format("\"from\": \"%s\"".indent(12), from);
formatter.format("}".indent(8).stripTrailing());
formatter.flush();
return string.toString();
}
}
}
然后,如果我们填充数据并使用 println 调用,我们将获得一个有效的 JSON 值。
DataObject dataObject = new DataObject();
dataObject.aPid = "AGNT8935i";
dataObject.location = "New York";
dataObject.senderDomainId = "DOMN67";
dataObject.timeZone = "Eastern Standard Time";
dataObject.senderDomainAgentId = "DMNAGNT94-eoi7436ur-334kjery3-oe73573ne";
dataObject.recipientDomainName = "tic.com";
DataObject.BusinessMsg businessMsg = new DataObject.BusinessMsg();
businessMsg.id = "BSMG227e0e9f-2af9-4f49-8886-39eadda4d8f3";
businessMsg.to = "tic.com";
businessMsg.from = "tic.com";
dataObject.businessMsg = businessMsg;
System.out.println(dataObject);
输出
{
"sendParams": {
"aPid": "AGNT8935i",
"location": "New York",
"senderDomainId": "DOMN67",
"timeZone": "Eastern Standard Time",
"senderDomainAgentId": "DMNAGNT94-eoi7436ur-334kjery3-oe73573ne",
"recipientDomainName": "tic.com",
"businessMsg": {
"id": "BSMG227e0e9f-2af9-4f49-8886-39eadda4d8f3",
"to": "tic.com",
"from": "tic.com"
}
}
}
评论
0赞
Reilas
6/12/2023
所以,你是说字段名称、类变量将是动态的?您可以使用反射来捕获值。如果这是你的暗示,我可以写一个例子。
0赞
edward
6/12/2023
感谢您提供的解决方案,如果数据是动态的,并且还嵌套了诸如 {“sendParams”:{“aPid”:“AGNT8935i”, “location”:“New York”, “senderDomainId”:“DOMN67”, “timeZone”:“Eastern Standard Time”, “senderDomainAgentId”:“DMNAGNT94-eoi7436ur-334kjery3-oe73573ne”, “recipientDomainName”:“tic.com”, “businessMsg”:{id“:”BSMG227e0e9f-2af9-4f49-8886-39eadda4d8f3“,”to:“tic.com”,“from”:“tic.com”}} }
0赞
Reilas
6/12/2023
如果字段名称始终相同,则可以使用我提供的相同方法。我可以为你格式化。就一分钟。
0赞
Reilas
6/12/2023
@edwardacholonu,我已经更新了我的答案。
0赞
edward
6/12/2023
这非常有用,非常感谢,我需要将 sendParams 添加为 JSON 的一部分来完成它。
评论