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

时间:2014-05-05 04:59:54

标签: java json gson

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

2 个答案:

答案 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