当前位置: 首页 > 面试题库 >

Jackson-在运行时修改属性而无需注释

冯风史
2023-03-14
问题内容

假设我有一个豆子:

public class Msg {
  private int code;
  private Object data;

   ... Getter/setters...
}

然后使用这种测试代码将其转换为JSON或XML:

public String convert() {
  Msg msg = new Msg();
  msg.setCode( 42 );
  msg.setData( "Are you suggesting coconuts migrate?" );

  ObjectMapper mapper = new ObjectMapper();
  return mapper.writeValueAsString( msg );
}

输出将是这样的:

{"code":42,"data":"Are you suggesting coconuts migrate?"}

现在,假设我想用一些动态名称替换“ data”属性:

public String convert(String name) {
  Msg msg = new Msg();
  msg.setCode( 42 );
  msg.setData( "Are you suggesting coconuts migrate?" );

  ObjectMapper mapper = new ObjectMapper();
  // ...DO SOMETHING WITH MAPPER ...
  return mapper.writeValueAsString( msg );
}

如果我调用函数 convert(“ toto”), 我将获得以下输出:

{"code":42,"toto":"Are you suggesting coconuts migrate?"}

如果我调用函数 convert(“ groovy”), 我会得到以下输出:

{"code":42,"groovy":"Are you suggesting coconuts migrate?"}

当然,我可以在JSON创建后执行String替换,但是如果您对程序化方法有一个满意的答案,我会接受。

谢谢


问题答案:

您可以使用 PropertyNamingStrategyclass覆盖class属性。查看此类的简单实现:

class ReplaceNamingStrategy extends PropertyNamingStrategy {

    private static final long serialVersionUID = 1L;

    private Map<String, String> replaceMap;

    public ReplaceNamingStrategy(Map<String, String> replaceMap) {
        this.replaceMap = replaceMap;
    }

    @Override
    public String nameForGetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName) {
        if (replaceMap.containsKey(defaultName)) {
            return replaceMap.get(defaultName);
        }

        return super.nameForGetterMethod(config, method, defaultName);
    }
}

示例程序如下所示:

import java.io.IOException;
import java.util.Collections;
import java.util.Map;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.cfg.MapperConfig;
import com.fasterxml.jackson.databind.introspect.AnnotatedMethod;

public class JacksonProgram {

    public static void main(String[] args) throws IOException {
        Msg msg = new Msg();
        msg.setCode(42);
        msg.setData("Are you suggesting coconuts migrate?");

        System.out.println(convert(msg, "test"));
        System.out.println(convert(msg, "toto"));
        System.out.println(convert(msg, "groovy"));
    }

    public static String convert(Msg msg, String name) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setPropertyNamingStrategy(new ReplaceNamingStrategy(Collections.singletonMap("data", name)));
        return mapper.writeValueAsString(msg);
    }
}

上面的程序打印:

{"code":42,"test":"Are you suggesting coconuts migrate?"}
{"code":42,"toto":"Are you suggesting coconuts migrate?"}
{"code":42,"groovy":"Are you suggesting coconuts migrate?"}


 类似资料:
  • 问题内容: 我们在模型pojos中的一些方法已被注释为: columnDefinition 属性取决于数据库供应商,因此在尝试使用Hibernate删除HSQLDB中的架构时会失败: 为了解决这个问题,我正在考虑这个解决方案(但不想花时间,如果不可能的话),在运行时,为每个方法列加注: 获取@Column批注 创建列注释的副本,使用javaassist将columnDefinition设置为nul

  • 问题内容: 我有一个运行的现有jar文件。它是Selenium RC服务器。我希望能够更改JVM httpProxy.host/port/etc系统值。一方面,我可以修改源代码并添加此功能。这将需要一些时间。还有另一种可能的方法吗?就像我自己的JAR(将设置这些JVM属性)在同一个JVM实例中调用selenium- rc(这样,它便能够修改其JVM变量的值)? 问题答案: 您可以使用以下命令在命令

  • 问题内容: 而且我正在尝试更改方法注释,但是java.lang.reflect.Method不包含任何地图字段(例如“ annotations”)或方法(例如“ getDeclaredAnnotationMap”) 只有但是我可以用这个字节数组做什么? 那么,如何修改方法的注释呢? 编辑: 我创建了:http : //pastebin.com/T2rewcwU 但是,仅编辑此方法实例,如果取消注释

  • 问题内容: 我有一些人已经解决过的问题,但问题是我不了解我的实现中缺少什么。 我的hibernate代码的一部分如下: 问题是我想通过更改hibernate.connection.url属性中的“数据库”一词来选择要在运行时中使用的数据库。 在javaswing中,我正在实现此功能: } 然后,我用按钮检查所做的更改,从组合框中选择所需的数据库: 现在,debug1的输出正在更改,因此我在此打印中

  • Javascript文件 这段代码工作得很好,我检查了属性是否通过这个测试网站进行了更改。 现在,selenium和Firefox: 谢谢你

  • 修改属性(命令)是用于修改或更新特定类的属性的命令。修改属性意味着修改表格的字段。 在本章中,将学习如何更新属性。 以下语句是命令的基本语法。 以下是有关上述语法中选项的详细信息。 - 定义属性所属的类。 - 定义您想要更新的属性。 - 定义要更新的属性的属性。 - 定义您想要在属性上设置的值。 下表定义了用于更改属性的属性列表。 属性 类型 描述 LINKEDCLASS 字符串 定义链接的类名称