如何在不使用任何外部库或依赖项的情况下将 java 对象转换为 JSON 格式?

How do I convert a java object toJSON format without using any external libraries or dependencies for java?

提问人:edward 提问时间:6/10/2023 最后编辑:OneCricketeeredward 更新时间:6/12/2023 访问量:241

问:

static class DataObject {
    private String access;
    private String foo;
    private Int age;
}   

{"access" : "value","foo":"value","age":"value"}

不使用 Gson 或 jackson。只是香草爪哇

有没有更简单的方法?

Java JSON API

评论

0赞 GreyBeardedGeek 6/10/2023
更简单的方法?不。你必须按照@Reilas回答的去做,或者自己编写一个 JSON 序列化程序。最好的、“最简单”的方法是使用库。
0赞 Bohemian 6/12/2023
请修复代码中的编译错误。

答:

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 的一部分来完成它。