我正在使用gson生成Java中对象集合的json(有些对象也有其他集合)。此json将用于为具有不同许可级别的用户填充网页。因此用户可以看到的细节不同。网页只显示它需要显示的内容,但是如果我对两个不同的页面使用相同的json,那么html源代码将拥有比它应有的更多的数据。有没有办法告诉gson哪些类应该添加到json中的哪些变量?据我搜索,我找不到一个简单的方法。要么我自己生成json,要么从gson生成的json中清除额外的数据。
答案 0 :(得分:1)
我需要使用相同的类来获得不同的清除级别并获得不同的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)
,您会收到明确的编译错误,表明您做错了什么,而且通过调用{快速修复以获得正确的结果{1}}安全而明确地完成你想要的任务。
答案 1 :(得分:0)
你可以在你不想要的字段上添加这样的曝光注释:
@Expose(serialize = false, deserialize = false)
private String address;
此处提供更多信息:
https://sites.google.com/site/gson/gson-user-guide#TOC-Gson-s-Expose