将 JSON 对象数组映射到 java.util.Map,反之亦然

2024-01-11

问题是如何将 JSON 对象数组映射到java.util.Map其中每个键都是对象的某个指定属性,值是对象本身。

JSON:

{"items": [{"field1": 1, "field2": "Hello"}, {"field1": 2, "field2":"World"}]}

Java POJO:

public class Storage {
    private Map<Integer, Item> items;
}

public class Item {
    private Integer field1;
    private String field2;
}

那么有没有一种方法可以指定ObjectMapper它应该使用field1将项目数组反序列化为键时,将每个 JSON 对象的属性作为键Map?


如何反序列化 JSON 字符串

您可以使用 Jackson 反序列化 JSON 字符串:

例如,如果你有课Foo

public class Foo {

   private Bar[] items;

   // Constructor / Getters & Setters

} 

该类有一个类数组Bar

 public class Bar {

     private int field1;
     private String field2;


     // Constructor / Getters & Setters

 }

如果字段名称与 JSON 字符串中的字段名称匹配,则您可以执行以下操作来转换它:

String jsonString = "{\"items\": [{\"field1\": 1, \"field2\": \"Hello\"}, {\"field1\": 2, \"field2\":\"World\"}]}";

ObjectMapper mapper = new ObjectMapper();

Foo foo = mapper.readValue(jsonString, Foo.class);

如果您使用 Maven,则 pom.xml 中需要以下依赖项:

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson.version}</version>
    </dependency>

解决您的问题的方法:

选项 1 - 自定义解串器

写一个自定义的JsonDeserializer将 JSON 字符串反序列化为Storage带有字段的对象items类型的Map<String,Item>

 public class CustomDeserializer extends JsonDeserializer<Storage> {

    @Override
    public Storage deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
            throws IOException {

        Map<Integer, Item> map = new HashMap<>();

        ObjectCodec oc = jsonParser.getCodec();
        JsonNode rootNode = oc.readTree(jsonParser);
        JsonNode items = rootNode.get("items");

        for (int i = 0; i < items.size(); i++) {

            JsonNode childNode = items.get(i);

            Item item = new Item(childNode.get("field1").asInt(), childNode.get("field2").asText());

            map.put(item.getField1(), item);
        }

        return new Storage(map);
    }
}

然后你会注释你的Storage具有以下内容的类:

@JsonDeserialize(using = CustomDeserializer.class)

Your Storage类看起来像这样;

@JsonDeserialize(using = CustomDeserializer.class)
public class Storage {

   private Map<Integer, Item> items;

   public Storage(Map<Integer, Item> map) {
    this.items = map;
   }

   ...

}

选项 2 - 反序列化后创建地图

将 JSON 字符串反序列化为Storage具有数组的对象Item如开头所述,然后构建您的Map<Integer, Item> after.

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 JSON 对象数组映射到 java.util.Map,反之亦然 的相关文章

随机推荐

  • 使用 Google Analytics 进行 Vuejs 事件跟踪

    我希望跟踪按钮和链接上的谷歌分析事件 通常在 jquery 中 我会传递数据属性中的值并获取它们并调用所需的函数 我知道我不应该使用数据属性 所以我正在寻找执行此操作的最佳方法 可以有多个按钮使用不同的数据用途 属性 执行不同的跟踪 所以我
  • 加入条件查询给出错误“无法找到属性”

    我有两张表 Student 和 Courses 我必须连接两个表并获取特定字段 class Student extends Parent Long id Cache usage CacheConcurrencyStrategy READ W
  • char[] 和 char* 之间的区别? [复制]

    这个问题在这里已经有答案了 可能的重复 C char var 和 char var 之间的区别 https stackoverflow com questions 1880573 c difference between char var
  • 运行我的第一个 java 应用程序时出现 InvalidModuleDescriptorException

    我已经开始学习 Java 并在尝试运行我的第一个程序时遇到了问题 如下所示 public class HelloWorld public static void main String args TODO Auto generated me
  • Rcpp:无法打开共享对象文件

    我正在尝试开发一个 R 包 它利用阵列火 https github com arrayfire arrayfire 感谢 Rcpp 库 我已经开始编写示例代码 让我们将其命名为你好世界 cpp 看起来像这样 include
  • SQLAlchemy 按字段排序()

    我试图按字段对 SQLAlchemy ORM 对象进行排序 但使用特定的值顺序 既不是升序也不是降序 如果我在 MySQL 上执行此查询 它看起来像 SELECT letter FROM alphabet table WHERE lette
  • 在字典中存储函数 [Python]

    我目前正在构建一个应用程序 我需要迭代一系列基本执行相同操作的步骤 从而节省很少量的代码 约 15 行 步骤的数量将根据项目的配置方式而有所不同 因此对我来说为每个潜在实例创建单独的函数似乎有点愚蠢 在 JavaScript 中 我会做这样
  • 以编程方式更改 ASP.NET GridView 中列的样式(填充)

    我需要更改 ASP NET GridView 中一列的填充 而外部 CSS 文件中定义的所有其他 CSS 属性应保持不变 我该怎么做 提前致谢 更新 下面是我解决问题的代码 protected void gvwMaster RowDataB
  • Mac Kiosk 模式 API - 防止用户退出

    我正在编写一个 Mac 10 6 10 7 应用程序 该应用程序在允许用户访问计算机之前对 Active Directory 域对用户进行身份验证 我被告知不能允许用户通过传统登录服务登录 我已准备好身份验证代码 现在正在尝试使此登录窗口全
  • 在nosetests中有条件跳过TestCase装饰器

    有没有办法跳过整个TestCase基于使用鼻子测试的自定义条件 我的意思是unittest skip style I tried import unittest unittest skip No reason class TestFoo o
  • 如何在我的 fcm 消息中使用图像和 vibrate_timings

    我希望我的 FCM 通知包含自定义图像和振动模式 Firebase 提供的 AndroidNotification 类作为示例具有这两个变量 但我还没有看到任何方法让它工作 我尝试通过 C 类 AndroidNotification 将这两
  • 如何使滚动超过某个点后出现浮动菜单? [复制]

    这个问题在这里已经有答案了 我想让四个菜单选项卡在您滚动经过页面上的某个点 例如 1000px 后出现 我希望它们出现时从左向右滑入 这就是我想要的 但位于浏览器的左侧 任何意见都会受到赞赏 首先 您需要从跟踪页面的滚动开始 其次 您需要在
  • 重定向到 ASP.NET Core 的自定义“访问被拒绝”页面

    我正在编写一个使用 Windows 身份验证的 ASP NET Core 1 0 网站 我已经实现了授权并且正在按预期工作 目前 当给定用户的身份验证失败时 会显示通用的 HTTP 403 错误页面 如何配置 ASP NET Core 以便
  • 如何在 .NET 4.0 中使用代码契约而不让我的代码看起来混乱?

    我已经开始使用代码契约 并发现很难立即发现方法的 本质 以这个 非常简单 为例 public static void UserAddNew string domain string username string displayName C
  • 删除查询字符串和参数

    由于不值得在这里讨论的原因 Google 一直在为我的一个网站编制索引 其中 URL 中包含不必要的查询字符串 这些字符串是wordfence lh hid and wordfence logHuman 我想修改我的 htaccess文件以
  • Laravel 5 Seeder - 数据库中的多行

    我想知道是否可以像这样插入多行 或类似的东西
  • 我网站中所有页面的网站图标

    我了解到为网页添加网站图标的方法是在页面中添加以下几行 我应该在我网站的每个页面中添加此代码吗 我使用 Apache tomcat 集群来提供页面服务 还有其他简单的方法可以做到这一点吗 通常将一个名为 favicon ico 的文件放在网
  • 如何查看 Node.js Cloud Function 环境的文件系统性质?

    当我将 Cloud Function 部署到 GCP 用 Node js 编写 时 如何查看我的文件系统环境以进行调试 如果我想知道我当前的目录是什么或者我的应用程序旁边有哪些文件怎么办 当我们部署 Cloud Function 时 就会出
  • redux-observable 史诗,不发送任何新操作

    可能我是一个菜鸟 还没有完全理解这些东西应该如何工作 但是我在 redux observable 中有一个史诗 我想用它来创建一个承诺 它将分派一个动作并等待一个解决之前采取不同的行动 我通过将操作映射到来使其工作 IGNORE 但我真的不
  • 将 JSON 对象数组映射到 java.util.Map,反之亦然

    问题是如何将 JSON 对象数组映射到java util Map其中每个键都是对象的某个指定属性 值是对象本身 JSON items field1 1 field2 Hello field1 2 field2 World Java POJO