gpt4 book ai didi

java - 如何告诉 gson 在 Java 中将哪些字段添加到 json 中?

转载 作者:行者123 更新时间:2023-12-01 13:01:47 24 4
gpt4 key购买 nike

我正在使用 gson 生成 Java 中对象集合的 json(某些对象也有其他集合)。此 json 将用于为具有不同权限级别的用户填充网页。因此,用户可以看到的细节有所不同。网页只显示它需要显示的内容,但是如果我对两个不同的页面使用相同的 json,那么 html 源代码将包含比应有的更多数据。有没有办法告诉gson哪个类中的哪些变量应该添加到json中?据我搜索,我找不到简单的方法。要么我自己生成 json,要么清除 gson 生成的 json 中的额外数据。

最佳答案

I need to use same classes for different clearance levels and get different json.

你正在尝试使用 Gson 在同一个 JVM 中生成相同对象的多个不同 JSON 输出,这在 Gson 和任何好的序列化库中都会很困难,因为它们的明确目标本质上是相反的您正在寻找。

正确的做法是用不同的类来表示这些不同的许可级别,并像平常一样用 Gson 简单地序列化这些不同的类。通过这种方式,您可以将安全模型与序列化分开,让您安全地传递此信息。

/** 
* Core data class, contains all information the application needs.
* Should never be serialized for display to any end user, no matter their level.
*/
public class GlobalData {
private final String username;
private final String private_data;
private final String secure_data;
}

/** Interface for all data display operations */
public interface DisplayData {
/** Returns a JSON representation of the data to be displayed */
public String toJson();
}

/**
* Class for safe display to an untrusted user, only holds onto public
* data anyone should see.
*/
public class UserDisplayData implements DisplayData {
private final String username;

public UserDisplayData(GlobalData gd) {
username = gd.username;
}

public String toJson() {
return gson.toJson(this);
}
}

/**
* Class for safe display to a trusted user, holds private information but
* does not display secure content (passwords, credit cards, etc.) that even
* admins should not see.
*/
public class AdminDisplayData implements DisplayData {
private final String username;
private final String private_data;

public AdminDisplayData(GlobalData gd) {
username = gd.username;
private_data = gd.private_data;
}

public String toJson() {
// these could be different Gson instances, for instance
// admin might want to see nulls, while users might not.
return gson.toJson(this);
}
}

现在,您可以将数据清理和序列化分为两个单独的步骤,并使用类型安全性来确保您的 GlobalData 永远不会显示。

public void getDisplayData(GlobalData gd, User user) {
if(user.isAdmin()) {
return new AdminDisplayData(gd);
} else {
return new UserDisplayData(gd);
}
}

public void showData(DisplayData data) {
String json = data.toJson();
// display json however you want
}

如果您错误地尝试调用 showData(gd),您会收到一个明显的编译错误,表明您做错了什么,这是通过调用 获得正确结果的快速修复方法>showData(getDisplayData(gd, user)) 安全、清晰地完成您想要的操作。

关于java - 如何告诉 gson 在 Java 中将哪些字段添加到 json 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23465079/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com