Jackon json 字符串到 Java 对象使用泛型
Jackon json string to Java object using generics
我已经看到许多与我的以下查询相关的帖子,但无法准确找到如何处理此问题:
我有一个 class 如下:
public class MyClass<T> implements IMyInterface<String, T> {
@Override
public T myMethod(String jsonString) {
ObjectMapper mapper = new ObjectMapper();
//T result = mapper.readValue(jsonString, T.class) //for sure T.class does not make sense, but what is the alternative ?
}
}
我想将此 class 用作实用程序 class,供任何可以将其 json 字符串传递给 myMethod
并获得所需 Java 映射到他们在实例化 MyClass
时提到的 class 的对象。
举个例子,一个客户端代码
MyClass<MyType1> o1 = new MyClass<MyType1>();
MyType1 myType1 = o1.myMethod(aJsonString);
获取 MyType1
的实例
和另一个执行
的代码
MyClass<MyType2> o2 = new MyClass<MyType2>();
MyType2 myType2 = o2.myMethod(anotherJsonString);
获取 MyType2
的实例
我看到很多与 TypeReference 和 JavaType 用法相关的帖子,但无法准确掌握如何使它们适合我的上述用例。
我的主要 objective 是 MyClass
实际上应该作为一个 util class 在编译时不知道什么是 Java 对象它将转换输入 json串到。它应该只在运行时决定。
任何帮助将不胜感激!
非常感谢和最诚挚的问候
以下解决方案适合您。拥有类型 Class 的私有实例并在构造函数中对其进行初始化。
import org.codehaus.jackson.map.ObjectMapper;
public class MyClass<T> implements IMyInterface<String, T> {
private Class<T> clazz;
public MyClass(Class<T> clazz) {
this.clazz = clazz;
}
@Override
public T myMethod(String jsonString) throws Exception {
ObjectMapper mapper = new ObjectMapper();
T result = mapper.readValue(jsonString, clazz);
return result;
}
}
您的客户端代码将是:
MyClass<MyType1> o1 = new MyClass<MyType1>(MyType1.class);
MyType1 myType1 = o1.myMethod(aJsonString);
添加了第二个问题的答案:
在 spring 上下文文件中,如下定义您的 bean。
<bean id="simpleMyType1Class" class="com.yourpackage.MyClass">
<constructor-arg>
<!-- this can be any full path to a class -->
<value>com.yourpackage.MyType1</value>
</constructor-arg>
在Java代码中,如下获取其bean引用。
MyClass<MyType> o1 = (MyClass)context.getBean("simpleMyType1Class");
我已经看到许多与我的以下查询相关的帖子,但无法准确找到如何处理此问题: 我有一个 class 如下:
public class MyClass<T> implements IMyInterface<String, T> {
@Override
public T myMethod(String jsonString) {
ObjectMapper mapper = new ObjectMapper();
//T result = mapper.readValue(jsonString, T.class) //for sure T.class does not make sense, but what is the alternative ?
}
}
我想将此 class 用作实用程序 class,供任何可以将其 json 字符串传递给 myMethod
并获得所需 Java 映射到他们在实例化 MyClass
时提到的 class 的对象。
举个例子,一个客户端代码
MyClass<MyType1> o1 = new MyClass<MyType1>();
MyType1 myType1 = o1.myMethod(aJsonString);
获取 MyType1
和另一个执行
的代码MyClass<MyType2> o2 = new MyClass<MyType2>();
MyType2 myType2 = o2.myMethod(anotherJsonString);
获取 MyType2
我看到很多与 TypeReference 和 JavaType 用法相关的帖子,但无法准确掌握如何使它们适合我的上述用例。
我的主要 objective 是 MyClass
实际上应该作为一个 util class 在编译时不知道什么是 Java 对象它将转换输入 json串到。它应该只在运行时决定。
任何帮助将不胜感激!
非常感谢和最诚挚的问候
以下解决方案适合您。拥有类型 Class 的私有实例并在构造函数中对其进行初始化。
import org.codehaus.jackson.map.ObjectMapper;
public class MyClass<T> implements IMyInterface<String, T> {
private Class<T> clazz;
public MyClass(Class<T> clazz) {
this.clazz = clazz;
}
@Override
public T myMethod(String jsonString) throws Exception {
ObjectMapper mapper = new ObjectMapper();
T result = mapper.readValue(jsonString, clazz);
return result;
}
}
您的客户端代码将是:
MyClass<MyType1> o1 = new MyClass<MyType1>(MyType1.class);
MyType1 myType1 = o1.myMethod(aJsonString);
添加了第二个问题的答案:
在 spring 上下文文件中,如下定义您的 bean。
<bean id="simpleMyType1Class" class="com.yourpackage.MyClass">
<constructor-arg>
<!-- this can be any full path to a class -->
<value>com.yourpackage.MyType1</value>
</constructor-arg>
在Java代码中,如下获取其bean引用。
MyClass<MyType> o1 = (MyClass)context.getBean("simpleMyType1Class");