json Jackson通过类完全限定名动态反序列化

0yg35tkg  于 2023-02-01  发布在  其他
关注(0)|答案(2)|浏览(138)

我正在制定一个有这些要求的框架
开发人员开发他们的类(Bean),如下所示

class BeanA{
  
    int id;
    String appName;

   public void save() 
}

class BeanB{
  
    int id;
    String userName;

   public void save() 
}

orchestratoon.csv也是这样定义的,开发人员在这里输入他们的类

org.example.BeanA, http://fetch/bean/a/from/this/url
org.example.BeanB, http://fetch/bean/b/from/this/url
org.example.BeanC, http://fetch/bean/c/from/this/url

在此之后,我必须编写一个平台服务,它将从orchestration.csv文件中给定的url获取Bean数据,然后在fully qualified name提供的类中呈现
我的问题是,如何反序列化提取到类中的json,并调用该bean的save方法。
下面是伪代码。

ObjectMapper objectMapper = new ObjectMapper();

for className, URL in CSV
  
   String json = getObject(url)

   // Here is the problem, how do I deserialize it using ObjectMapper 
   
     objectMapper.readValue(json, Class.forName(className));   ---> It does not work , compile time error because of Class.forName and how do I call a save on it

任何帮助都会

mkshixfv

mkshixfv1#

根据您的具体情况,提取接口或抽象类中的save()方法。大多数情况下,接口是更好的选择:

public interface MyInterface {

  void save();
}

BeanABeanB等实现它,将反序列化结果强制转换为MyInterface并调用save()

Object object;
try {
  object = objectMapper.readValue(json, Class.forName("bean.class.full.name"));
} catch (JsonProcessingException exc) {
  throw new RuntimeException("invalid json", exc);
}
if (object instanceof MyInterface myInterface) {
  myInterface.save();
} else {
  throw new RuntimeException("appropriate message here");
}
ippsafx7

ippsafx72#

假设您成功地从URL中读取了表示特定类的JSON字符串,并且您知道类名,那么您可以使用ObjectMapper类及其方法<T> T readValue(String content, Class<T> valueType)。将json字符串作为内容放置,并作为类使用
public static Class<?> forName(String className) throws ClassNotFoundException。请参阅ObjectMapper javadoc here。另外,如果您希望它更简单,我编写了自己的JsonUtil,您甚至不必示例化ObjectMapper。您的代码将如下所示:

try {
    BeanB beanB = JsonUtils.readObjectFromJsonString(jsonStr, Class.forName(classNameStr));
} catch (IOException ioe) {
    ...
}

在本例中,类JsonUtils附带了由我编写和维护的开源MgntUtils库。请参见the Javadoc for JsonUtils class。MgntUtils库可以作为Maven工件从Maven Central获得,也可以从Github连同源代码和Javadoc一起获得

相关问题