Java:如何编写反序列化列表/集合的泛型?
我正在尝试重构我的反序列化方法,以使用泛型使我能够反序列化任何类型。对于不在集合中的对象,我可以这样做,如下所示:Java:如何编写反序列化列表/集合的泛型?,java,list,generics,arraylist,jackson,Java,List,Generics,Arraylist,Jackson,我正在尝试重构我的反序列化方法,以使用泛型使我能够反序列化任何类型。对于不在集合中的对象,我可以这样做,如下所示: public static <T> T parseProductData(String jsonData, Class<T> typeClass) throws IOException, IllegalAccessException { ObjectMapper objectMapper = new ObjectMapper(); objec
public static <T> T parseProductData(String jsonData, Class<T> typeClass) throws IOException, IllegalAccessException {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
T inputMessage = objectMapper.readValue(jsonData, typeClass);
return inputMessage;
}
LinkedHashMap<String,Integer> linkedHashMap = XXX.parseJsonComponentFromString(yyy);
LinkedList<T> list = new LinkedList<T>();
linkedHashMap.forEach((k,i) -> list.add(i));
以下是组件POCO类型的代码:
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.*;
import lombok.experimental.Accessors;
import org.apache.pulsar.common.io.SinkConfig;
import org.apache.pulsar.common.io.SourceConfig;
import java.util.List;
import java.util.Map;
@Setter
@Getter
@EqualsAndHashCode
@ToString
@Accessors(chain = true)
@Data
public class ComponentPOCO {
@JsonProperty
private String namespace;
@JsonProperty
private String tenant;
@JsonProperty
private String name;
@JsonProperty
private String type;
@JsonProperty
private String destinationTopicName;
@JsonProperty
private String artifactPathOrUrl;
@JsonProperty
private String className;
@JsonProperty
private List<String> inputs;
@JsonProperty
private String output;
@JsonProperty
private Map<String, Object> userConfig;
@JsonProperty
private String logTopic;
@JsonProperty
private Map<String, Object> configs;
@JsonProperty
private Integer parallelism;
@JsonProperty
public String sinkType;
@JsonProperty
private String sourceType;
@JsonProperty
public String runtimeFlags;
}
import com.fasterxml.jackson.annotation.JsonProperty;
进口龙目。*;
导入lombok.experimental.Accessors;
导入org.apache.pulsar.common.io.SinkConfig;
导入org.apache.pulsar.common.io.SourceConfig;
导入java.util.List;
导入java.util.Map;
@塞特
@吸气剂
@EqualsAndHashCode
@托斯特林
@访问器(链=真)
@资料
公共类组件POCO{
@JsonProperty
私有字符串名称空间;
@JsonProperty
私人承租人;
@JsonProperty
私有字符串名称;
@JsonProperty
私有字符串类型;
@JsonProperty
私有字符串destinationTopicName;
@JsonProperty
私有字符串工件;
@JsonProperty
私有字符串类名;
@JsonProperty
私人清单投入;
@JsonProperty
私有字符串输出;
@JsonProperty
私有映射用户配置;
@JsonProperty
私有字符串日志主题;
@JsonProperty
私有地图配置;
@JsonProperty
私有整数并行;
@JsonProperty
公共字符串类型;
@JsonProperty
私有字符串源类型;
@JsonProperty
公共字符串运行时间间隔;
}
您的代码有几个问题。使此代码按我认为您希望的方式工作的最快方法是使用以下方法替换此方法:
public LinkedHashMap<String,T> parseJsonComponentFromString(String fileContents){
try {
ObjectMapper mapper = new ObjectMapper()
.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return mapper.readValue(fileContents, new TypeReference<T>() {});
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
希望我能帮上忙。我个人认为,在Java问题中加入对Java的抨击是个坏主意,但这是经过深思熟虑的观点。在一个问题中调用Java泛型实现“不那么智能”也是一样的,这个问题表明您对这个主题了解不多。@fdreger这个问题实际上有很好的文档记录。例如,请参见此处:您应该以动态方式构建类型:
mapper.getTypeFactory().ConstructionCollectionType(List.class,typeClass)
。请看:另外,看看这个例子,您所说的“您可能想重新设计您的整个系统”是什么意思?我的目标是简单地反序列化JSON对象的集合/列表/任何内容,这样我就可以处理每一个对象。我不确定我是否理解其中的设计缺陷。例如,使用列表没有任何意义:只需使用我展示的LinkedHasMap即可。我只是假设像这样的事情发生在你的项目的其他地方LinkedHashMap中的字符串代表什么?它是。例如,以json:{“a”:100,“b”:“bruno”,“c”:true}
字符串表示单词“a”,“b”或“c”。这违反了我的用例。我的变量没有命名。请查看我的编辑中的数据。
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.*;
import lombok.experimental.Accessors;
import org.apache.pulsar.common.io.SinkConfig;
import org.apache.pulsar.common.io.SourceConfig;
import java.util.List;
import java.util.Map;
@Setter
@Getter
@EqualsAndHashCode
@ToString
@Accessors(chain = true)
@Data
public class ComponentPOCO {
@JsonProperty
private String namespace;
@JsonProperty
private String tenant;
@JsonProperty
private String name;
@JsonProperty
private String type;
@JsonProperty
private String destinationTopicName;
@JsonProperty
private String artifactPathOrUrl;
@JsonProperty
private String className;
@JsonProperty
private List<String> inputs;
@JsonProperty
private String output;
@JsonProperty
private Map<String, Object> userConfig;
@JsonProperty
private String logTopic;
@JsonProperty
private Map<String, Object> configs;
@JsonProperty
private Integer parallelism;
@JsonProperty
public String sinkType;
@JsonProperty
private String sourceType;
@JsonProperty
public String runtimeFlags;
}
public LinkedHashMap<String,T> parseJsonComponentFromString(String fileContents){
try {
ObjectMapper mapper = new ObjectMapper()
.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return mapper.readValue(fileContents, new TypeReference<T>() {});
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
LinkedHashMap<String,Integer> linkedHashMap = XXX.parseJsonComponentFromString(yyy);
LinkedList<T> list = new LinkedList<T>();
linkedHashMap.forEach((k,i) -> list.add(i));