java - 如何从java中的ObjectMapper获取自定义对象

标签 java

我正在执行以下操作:

IronRunId Id = new IronRunId("RunObject", "Runid1", 4);
ObjectMapper MAPPER = new ObjectMapper();
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("RunId", Id);
String json = MAPPER.writeValueAsString(map);

ObjectMapper mapper = new ObjectMapper();
Map<String, Object> map1 = mapper.readValue(json, new TypeReference<Map<String, Object>>() {});
IronRunId runId = (IronRunId) (map1.get("RunId"));

但这给了我一个错误:无法将 java.util.LinkedHashMap 转换为 IronRunId 为什么map.get()返回的对象是linkedhashmap类型的?

相反,如果我这样做:

List<Object> myList = new ArrayList<Object>();
myList.add("Jonh");
myList.add("Jack");
map.put("list", myList);

那么mapper.readValue之后map.get()返回的对象就是ArrayList类型。

为什么有区别?将默认类型插入映射会返回正确的对象。但在 map 中插入自定义对象则不然。

有人知道怎么做吗?

最佳答案

Map<String, Object> map1 = mapper.readValue(json, new TypeReference<Map<String, Object>>() {});

基本上翻译为,返回一个带有 String 类型的键和 Object 类型的值的 Map。所以, jackson 给了你类型 String 的 key 和类型 Object 的值。 Jackson 不知道您的自定义对象,这就是为什么它为您提供了自己的 native 边界 Object这是 Map ,具体来说,一个LinkedHashMap ,这就是为什么你得到 LinkedHashMap 的原因当做get时到返回的Map

所以将其更改为:

Map<String, IronRunId> map1 = mapper.readValue(json, new TypeReference<Map<String, IronRunId>>() {});

此外,声明其接口(interface)类型的对象而不是其具体类型是一个很好的做法。所以而不是

HashMap<String, Object> map = new HashMap<String, Object>();

成功

Map<String, Object> map = new HashMap<String, Object>();

编辑

作为对您添加的问题的回应,您可以创建一个包装器对象来处理所有对象。像这样的东西。

class Wrapper{

    private IronRunId ironRunId;
    private long time;
    private Map<String, String> aspects;
    private String anotherString;

    public long getTime() {
        return time;
    }
    public void setTime(long time) {
        this.time = time;
    }
    public Map<String, String> getAspects() {
        return aspects;
    }
    public void setAspects(Map<String, String> aspects) {
        this.aspects = aspects;
    }
    public String getAnotherString() {
        return anotherString;
    }
    public void setAnotherString(String anotherString) {
        this.anotherString = anotherString;
    }
    public IronRunId getIronRunId() {
        return ironRunId;
    }
    public void setIronRunId(IronRunId ironRunId) {
        this.ironRunId = ironRunId;
    }
}

然后您可以在此类中存储不同的对象。

修订版

public static void main(String[] args) throws JsonGenerationException, JsonMappingException, IOException{
    IronRunId Id = new IronRunId("RunObject", "Runid1", 4);
    Map<String, String> aspects = new HashMap<String, String>();
    aspects.put("aspectskey1", "aspectsValue1");
    aspects.put("aspectskey2", "aspectsValue2");
    aspects.put("aspectskey3", "aspectsValue3");
    String anotherString = "anotherString";
    long time = 1L;

    Wrapper objectWrapper = new Wrapper();
    ObjectMapper objectMapper = new ObjectMapper();

    objectWrapper.setIronRunId(Id);
    objectWrapper.setTime(time);
    objectWrapper.setAnotherString(anotherString);
    objectWrapper.setAspects(aspects);

    Map<String, Wrapper> map = new HashMap<String, Wrapper>();
    map.put("theWrapper", objectWrapper);
    String json = objectMapper.writeValueAsString(map);

    Map<String, Wrapper> map1 = objectMapper.readValue(json, new TypeReference<Map<String, Wrapper>>() {});
    Wrapper wrapper = map1.get("theWrapper");

    System.out.println("run id : " +  wrapper.getIronRunId().toString());
    System.out.println("time : " + wrapper.getTime());
    System.out.println("aspects : " + wrapper.getAspects().toString());
    System.out.println("anotherString : " + wrapper.getAnotherString());
}

关于java - 如何从java中的ObjectMapper获取自定义对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17823227/

相关文章:

java - 将java中的日期格式从ddMMyyyy更改为dd-MM-yyyy

java - Result 类型的方法 raw() 已弃用

java - Eclipse (JBoss Developer Studio) 不自动构建 JPA 元模型类

java - 如何将 'Scanner' 与 'LenthOfString' 匹配在一起工作?

java - 创建给定类类型的实例

java - 使用 jni 从 C++ 将 UTF 字符发送到 Java

java - 在 Java 中存储对单个 SecureRandom 的引用?

java - 表中的 LibGDX 按钮超出屏幕

java - InflateException 使用滑行加载图像时发生

java - 如何从从 C# 接收到的字节数组加载图像?安卓应用