有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java gson intrepret特定字段大写

我有一个带有一些字段的类,例如

public class Message {

    public Enum Type {
        TEXT,
        PICTURE;
    }

    private Type type;
    private String text;
    private int id;
}

假设我有一个json,如下所示

[ { "id" : "1",
    "data" : "hello",
    "type" : "text",
  },
  { "id" : "2",
    "data" : "<someImageUrl>",
    "type" : "picture",
  },
]

我可以通过调用

Gson gson = new Gson();
ArrayList<Message> messages = gson.fromJson(jsonResult, new TypeToken<List<Message>>() {}.getType());

酷。不幸的是,由于json对象和枚举中定义的实例之间的大小写差异,Type字段仍然为null。如何改变gson的行为,使其将json类型的对象解释为大写

我想到的潜在解决方法:

  • 为枚举类型分配序数值,使其与json中给出的匹配(即TEXT("text")
  • 按分隔符“}”拆分json结果
  • 将所有出现的-someEnumType-替换为-someEnumType-

差不多

public enum Type {
    TEXT("text"),
    PICTURE("picture");

    private final String value

    private MessageType(String value) {
        this.value = value;
    }

    public String getValue() {
        return value
    }
}
...

   String[] jsonResultSplit = StringUtils.split(jsonResult, "},") 
   for (String jsonMessage : jsonResultSplit) {
        for (MessageType messageType : MessageType.values()) {
            if (jsonMessage.contains("\"type:\" : \"" + messageType.getValue() + "\"")) {
                jsonMessage.replace(
                        "\"type:\" : \"" + messageType.getValue() + "\"",
                        "\"type:\" : \""
                                + StringUtils.capitalize(messageType.getValue() + "\""));
            }
        }
    }
    jsonResult = StringUtils.join(jsonResultSplit);
    Gson gson = new Gson();
    ArrayList<Message> messages = gson.fromJson(jsonResult, new TypeToken<List<Message>>() {}.getType());

然而,这似乎有点黑客行为,如果消息包含“}”或其他内容,字符串将被错误拆分


共 (2) 个答案

  1. # 1 楼答案

    最简单的方法是对枚举使用@SerializedName注释

    public Enum Type {
        @SerializedName("text")
        TEXT,
    
        @SerializedName("picture")
        PICTURE
    }
    

    @SerializedName不仅可以用于大写,还可以用于更改枚举或变量的名称,例如

    public enum Gender {
        @SerializedName("boy")
        MALE,
    
        @SerializedName("girl")
        FEMALE
    }
    

    Reference

    正如@Sotirios所建议的,您需要注释text以将json键映射到您的变量

     @SerializedName("data")
     private String text;
    

    现在可以像前面一样使用Gson反序列化json

    Gson gson = new Gson();
    ArrayList<Message> messages = gson.fromJson(jsonResult, new TypeToken<List<Message>>() {}.getType());
    

    希望这有帮助

  2. # 2 楼答案

    您必须注册自己的^{}才能进行转换

    Gson gson = new GsonBuilder().registerTypeAdapter(Type.class,
                new TypeAdapter<Type>() {
    
                    @Override
                    public void write(JsonWriter out, Type value)
                            throws IOException {
                        out.value(value.name().toLowerCase());
                    }
    
                    @Override
                    public Type read(JsonReader in) throws IOException {
                        return Type.valueOf(in.nextString().toUpperCase());
                    }
                }).create();
    

    请注意,还应注释

    private String text;
    

    使用@SerializedName("data"),因为它与JSON名称不匹配

    "data" : "hello",