当前位置: 首页 > 知识库问答 >
问题:

如何使用大写字段名将字符串序列化为对象?[副本]

上官彬
2023-03-14

我使用ObjectMapper像:

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

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

我不想在每个字段上放置@JsonProperty(value="大写字段名称"),因为它已经这样命名了。我试图用大写的方式设置一个setter,但它什么也没做。只有具有@JsonProperty注释的字段才会被序列化。

是否有一些全局注释可以在类中使用?


共有2个答案

暴向笛
2023-03-14

您可以通过使用谷歌的Gson库和创建自定义反序列化器来实现这一点。

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

  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());
    }
}
柴彬
2023-03-14

您可以使用:

objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);

你可以在这里找到更多细节。

 类似资料:
  • 问题内容: 我能够将一个对象序列化为一个文件,然后再次还原它,如下面的代码片段所示。我想将对象序列化为字符串并存储到数据库中。谁能帮我? 问题答案: 你应该使用BLOB。使用JDBC非常简单。 你发布的第二个代码的问题是编码。你还应该对字节进行编码,以确保它们均不会失败。 如果你仍然想将其记录为字符串,则可以使用java.util.Base64对字节进行编码。 仍然应该将CLOB用作数据类型,因为

  • 我使用JavaScript创建了以下字符串: 我想得到: 我试过这个: 但我得到了: 你能帮我吗?

  • 问题内容: 如何将上述字符串反序列化为java对象。 我正在使用的类是 问题答案: @基达 我假设您可以控制JSON输入字符串的创建方式。我认为JSON字符串格式不正确,无法对地图类型进行默认的GSON反序列化。 我已经修改了输入字符串供您考虑,这将导致非null的LocalLocationId 如果我对输入字符串的假设不正确,请发表评论。 编辑1:由于无法修改输入,请考虑编写自定义解串器。以下是

  • 我尝试从一个用于存储Spring会话的Redis服务器反序列化String到Java对象,并且我想在Spring框架之外反序列化它。我认为Spring Redis序列化器可能使用默认字符集UTF-8来将Java对象序列化为字符串。 Redis中的字符串: 错误消息: 我知道用UTF-8在Byte[]和String之间的转换很可能是问题所在,但我还是想问一下,是否有人知道如何在不修改序列化部分的情况

  • 问题内容: 我有这个JavaScript原型: 然后创建一个新对象: 如果我做: 结果是: 但我需要将对象的类型包含在JSON字符串中,如下所示: 有没有使用框架之类的方法来执行此操作的快速方法?还是我需要在类中实现一个方法并手动执行? 问题答案: 编辑: 将字符串化 所有类的 “属性”。如果只想保留其中一些,则可以这样分别指定:

  • 我需要序列化一个简单的Java对象列表到JSON使用谷歌Gson库。 我想我可以将成员变量重命名为UpperCamelCase,但可能还有另一种方法?