如何使用大写字段名称将String序列化为Object?

时间:2018-02-09 14:13:58

标签: java jackson

我使用ObjectMapper之类的:

MyObject object = new ObjectMapper().readValue(jsonString, MyObject.class);

MyObject有100个字段,它们都是大写的。

我不想放 每个字段都有@JsonProperty(value = "CapitalizedFieldName"),因为它已经以这种方式命名。我试图以大写的方式设置一个setter但它没有做任何事情。只有@JsonProperty注释的字段才会被序列化。

我可以在课堂上使用一些全局注释吗?

2 个答案:

答案 0 :(得分:2)

您可以使用:

objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);

您可以找到更多详情here

答案 1 :(得分:0)

您可以使用Google的Gson Library并创建自定义反序列化器来实现此目的。

例如:考虑要反序列化的Employee类。

  public class Employee {
        private String name;
        private String cell;
        public Employee(String name, String cell) {
            super();
            this.name = name;
            this.cell = cell;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getCell() {
            return cell;
        }
        public void setCell(String cell) {
            this.cell = cell;
        }
       }

将自定义反序列化程序编写为:

public class CapsDeserializer implements JsonDeserializer<Employee> {

    @Override
    public Employee deserialize(JsonElement json, Type arg1, JsonDeserializationContext arg2)
            throws JsonParseException {
        JsonObject jobject = json.getAsJsonObject();

        try {
            Employee emp = new Employee(
                    jobject.get(Employee.class.getDeclaredField("name").getName().toUpperCase()).getAsString(),
                    jobject.get(Employee.class.getDeclaredField("cell").getName().toUpperCase()).getAsString());
            return emp;
        } catch (NoSuchFieldException | SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

}

注意:字段名称可通过反射访问,然后转换为大写字母。由于类的字段名称是小写字母,而输入的json的字段名称是大写字母。

要执行的示例程序:

public class GsonExampleApplication {

    public static void main(String[] args) {
        Gson gson = new Gson();

        Employee test = new Employee("", "");
        test.setCell("1234567891");
        test.setName("abhishek");

        System.out.println("" + gson.toJson(test));

        String json = "{\"NAME\":\"abhishek\",\"CELL\":\"1234567891\"}";
        FieldNamingStrategy f = gson.fieldNamingStrategy();

        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.registerTypeAdapter(Employee.class, new CapsDeserializer());
        Gson cgson = gsonBuilder.create();

        Employee obj = cgson.fromJson(json, Employee.class);

        System.out.println(obj.getName() + " " + obj.getCell());
    }
}