首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用org.json的Java 14记录

使用org.json的Java 14记录
EN

Stack Overflow用户
提问于 2022-06-18 20:18:20
回答 2查看 187关注 0票数 3

我想用org.json库创建新的JSON对象,但是我注意到Java14记录有问题。

当我打电话的时候

代码语言:javascript
复制
String json = new JSONObject(new Order("", "Albert", "GOOGL", "SELL", 97.9, 90L)).toString();

字段为空。

我想是因为java记录没有使用像getXYZ这样的旧的getter吗?

周围有简单的工作吗?我是说不用不同的图书馆。或者我的假设是错误的。

代码语言:javascript
复制
public record Order(
    String id,
    String userId,
    String securityId,
    String type,
    Double price,
    Long quantity
) {
}

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20220320</version>
</dependency>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-18 21:55:51

如果您不想使用其他库,如JacksonGson (在我看来,这将是一个更好的解决方案),您可以编写自己的转换器:

代码语言:javascript
复制
public final class JsonConverter {

    private JsonConverter() {
    }
    
    @SneakyThrows
    public static String toJSON(Object object) {
        Class<?> c = object.getClass();
        JSONObject jsonObject = new JSONObject();
        for (Field field : c.getDeclaredFields()) {
            field.setAccessible(true);
            String name = field.getName();
            Object value = field.get(object);
            jsonObject.put(name, value);
        }
        return jsonObject.toString();
    }
}

你可以用它,比如:

代码语言:javascript
复制
public static void main(String[] args) {
    Order order = new Order("", "Albert", "GOOGL", "SELL", 97.9, 90L);
    System.out.println(order);

    JSONObject jsonObject = new JSONObject(order);
    System.out.println(jsonObject.toString());

    System.out.println(JsonConverter.toJSON(order));
}

输出:

代码语言:javascript
复制
OrderRecord[id=, userId=Albert, securityId=GOOGL, type=SELL, price=97.9, quantity=90]
{}
{"quantity":90,"price":97.9,"securityId":"GOOGL","id":"","type":"SELL","userId":"Albert"}

这是一个真正的解决办法。但是,它使用的正是org.json

票数 1
EN

Stack Overflow用户

发布于 2022-06-18 21:57:55

根据文档 JSONObject(Object )构造函数

使用bean JSONObject getters从对象构造。

因此,正如您注意到的,它希望getter格式为getFieldName(),但在记录中,getter的名称不同。

例如,文件价格的获取者应该是price(),而不是getPrice()

一个可能的解决方案是在record类中添加getter,如下所示:

代码语言:javascript
复制
   public record Order(
            String id,
            String userId,
            String securityId,
            String type,
            Double price,
            Long quantity
    ) {
    
    
        public Double getPrice() { // Compliant
            return price;
        }
    
        public String getId() { // Compliant
            return id;
        }
    
        public String getSecurityId() { // Compliant
            return securityId;
        }
    
        public String getType() { // Compliant
            return type;
        }
    
        public Long getQuantity() { // Compliant
            return quantity;
        }
    }

您应该看到这样的输出:

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72672489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档