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

使用Java和Jackson将Json序列化为通用结构而无需模式

柴寂离
2023-03-14
问题内容

我需要序列化JSON,而不必附加到生成对象的特定架构,例如,某些通用set / map / hashmap。

作为输入 ,我有一个带有JSON的字符串。我不知道该JSON的架构。

作为输出, 我想要一个具有输入键值序列化的Java对象(例如Hashmap或类似对象)。

请注意, 输入JSON既具有基本字段,又具有Array / List。

我必须使用Java和Jackson(或其他一些库)。我怎么可能那样做?


问题答案:

Jackson数据绑定功能可以使用String键和Object值(也可以是地图或集合)将任何json输入读取到Map中。您只是告诉映射器,您想将json读入映射。您可以通过给映射器适当的类型引用来做到这一点:

import java.util.*;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Test
{
    public static void main(String[] args)
    {
        try {
            String json = "{ "
                    + "\"string-property\": \"string-value\", "
                    + "\"int-property\": 1, "
                    + "\"bool-property\": true, "
                    + "\"collection-property\": [\"a\", \"b\", \"c\"], "
                    + "\"map-property\": {\"inner-property\": \"inner-value\"} "
                    + "}";

            ObjectMapper mapper = new ObjectMapper();
            Map<String, Object> map = new HashMap<>();
            // convert JSON string to Map
            map = mapper.readValue(json, new TypeReference<Map<String, Object>>(){});

            System.out.println("input: " + json);
            System.out.println("output:");
            for (Map.Entry<String, Object> entry : map.entrySet()) {
                System.out.println("key: " + entry.getKey());
                System.out.println("value type: " + entry.getValue().getClass());
                System.out.println("value: " + entry.getValue().toString());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输出:

input: { "string-property": "string-value", "int-property": 1, "bool-property": true, "collection-property": ["a", "b", "c"], "map-property": {"inner-property": "inner-value"} }
output:
key: string-property
value type: class java.lang.String
value: string-value
key: int-property
value type: class java.lang.Integer
value: 1
key: bool-property
value type: class java.lang.Boolean
value: true
key: collection-property
value type: class java.util.ArrayList
value: [a, b, c]
key: map-property
value type: class java.util.LinkedHashMap
value: {inner-property=inner-value}


 类似资料:
  • 我正在编写一个Java spring boot mvc应用程序,它可以导出/导入数据。我写了一个包装类,它应该为学生类序列化/反序列化数据。它适用于导出,但在导入过程中出现错误 下面是我的maven jackson依赖项: 最后是转换的方法: 上面提到了Mapper.ReadValue(stream,typeReference)处的MismatchInputException ObjectMapp

  • 问题内容: 我希望这个问题最终能找到一个答案,使之永远清楚。 有模特儿: JSON输入: 以及两种反序列化泛型类型的推荐方法: 要么 Jackson永远无法处理通用类型T,它认为这是JavaType的Map,但由于类型擦除而找到了对象类型构造函数参数,并抛出错误。那是杰克逊的臭虫,还是我做错了什么?TypeReference或JavaType的显式规范还有什么用? 问题答案: 您需要在构造函数上添

  • 试图将JSON反序列化为我创建的Java bean。对杰克逊和这项努力来说真的很新鲜,所以请容忍我。我有以下几点: 由于JSON中的对象被反复使用,我的Java Bean被分解为几个部分,因此: ...和以类似方式实现的另一个BlockBean类(为简洁起见省略)。我使用杰克逊来完成这个任务,我的问题是——杰克逊中是否有序列化和反序列化的机制?理想情况下,我想要这样的东西(下面是伪代码,因为我无法

  • 现在我和杰克逊一起工作,我有一些问题。 首先。我有两个服务,第一个是数据收集和发送服务,第二个是接收这些数据,例如,将其记录到文件中。 因此,第一个服务具有如下类层次结构: 第二个服务具有如下类层次结构: 第一个服务对无所知。 我在第一个服务上发送数据的方式: 所以,我想将json拟人化为的Collection,而不是的Collection(

  • 我是一个新手,正在尝试编写一个简单的应用程序,从大学校中提取一些学校数据。组织。json数据如下所示: 我的结构如下所示: 当我运行代码时,我得到“json:无法将对象解组为[]main.SchoolStruct类型的Go值” 我正在使用gopencils库来提出我的请求,并成功地将其用于非常简单的请求。你知道我可能做错了什么吗?

  • 我在使用spring反序列化json数组时遇到一个问题。我有来自服务的json响应: 我使用spring WebFlux的新WebClient获得了这个json,代码如下: AccountorDerList AccountOrder是一个映射字段的简单pojo。 实际上,当我点击get时,它说: 如何使用新的webflux模块正确反序列化json?我做错了什么? 更新05/02/2018 两个答案