使用Gson序列化公开字段时如何更改字段名称?

时间:2019-06-03 14:04:04

标签: java json gson

我正在使用Gson序列化Java对象并返回json字符串。该对象有很多字段,但是我想特别返回4。我使用@Expose注释告诉Gson忽略任何其他字段,但我也希望能够更改要返回的这些字段的名称。以这种方式使用GsonBuilder

Gson gsonBuilder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().setPrettyPrinting().create();

我只能使用@Expose来获取字段。是否可以使用@SerializedName@Expose一起在返回这些字段之前更改它们的名称?使用这两个批注会阻止任何内容返回,但是我还发现仅使用@SerializedName批注(并删除.excludeFieldsWithoutExposeAnnotation())也会阻止返回这些字段。

1 个答案:

答案 0 :(得分:0)

您处在正确的轨道上。 这是一个工作示例:

package test;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class MyData {
  @Expose
  private String id;

  @Expose
  @SerializedName("fileOriginalName")
  private String myFilename;

  @Expose
  @SerializedName("fileOriginalPath")
  private String myPath;

  private String myName;

  public String getId() {
    return id;
  }

  public void setId(String id) {
    this.id = id;
  }

  public String getMyFilename() {
    return myFilename;
  }

  public void setMyFilename(String myFilename) {
    this.myFilename = myFilename;
  }

  public String getMyPath() {
    return myPath;
  }

  public void setMyPath(String myPath) {
    this.myPath = myPath;
  }

  public String getMyName() {
    return myName;
  }

  public void setMyName(String myName) {
    this.myName = myName;
  }

}

呼叫者:

package test;

import java.lang.reflect.Type;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;

public class Demo {
  static final Type MYDATA_TYPE = new TypeToken<MyData>() {
  }.getType();
  public static void main(String[] args){
    Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().setPrettyPrinting().create();

    MyData d = new MyData();

    d.setId("10");
    d.setMyFilename("was called myFilename");
    d.setMyName("should not be visible");
    d.setMyPath("was called myPath");

    String json = gson.toJson(d, MYDATA_TYPE);
    System.out.println(json);
  }
}

以下是输出:

{
  "id": "10",
  "fileOriginalName": "was called myFilename",
  "fileOriginalPath": "was called myPath"
}