Jsonpath 与 Jackson 或 Gson

2024-03-17

我收到一个大的 json 文档,我只想将其中的一部分解析到我的 java 类中。我正在考虑使用像 jsonpath 这样的东西从中提取部分数据,而不是创建 java 类的整个层次结构。

Jackson 或 Gson 是否以任何方式支持 jsonpath ?如果是,您能为我提供一些示例或指出用于此目的的另一个标准库吗?

例如,假设我有一个以下文档,并且我只想在我的 java 类中从中提取以下数据:

$.store.book[0] - 只有第一本书 $.store.bicycle.price - 自行车的价格

{
    "store": {
        "book": [
            {
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sayings of the Century",
                "price": 8.95
            },
            {
                "category": "fiction",
                "author": "Evelyn Waugh",
                "title": "Sword of Honour",
                "price": 12.99
            },
            {
                "category": "fiction",
                "author": "Herman Melville",
                "title": "Moby Dick",
                "isbn": "0-553-21311-3",
                "price": 8.99
            },
            {
                "category": "fiction",
                "author": "J. R. R. Tolkien",
                "title": "The Lord of the Rings",
                "isbn": "0-395-19395-8",
                "price": 22.99
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    },
    "expensive": 10
}

The Jayway JsonPath https://github.com/jayway/JsonPath库支持使用 JSON 路径读取值。

例如:

String json = "...";

Map<String, Object> book = JsonPath.read(json, "$.store.book[0]");
System.out.println(book);  // prints {category=reference, author=Nigel Rees, title=Sayings of the Century, price=8.95}

Double price = JsonPath.read(json, "$.store.bicycle.price");
System.out.println(price);  // prints 19.95

您还可以将 JSON 对象直接映射到类,例如 GSON 或 Jackson:

Book book = JsonPath.parse(json).read("$.store.book[0]", Book.class);
System.out.println(book);  // prints Book{category='reference', author='Nigel Rees', title='Sayings of the Century', price=8.95}

如果你想专门使用 GSON 或 Jackson 来进行反序列化(默认是使用 json-smart),你还可以这样配置:

Configuration.setDefaults(new Configuration.Defaults() {
    private final JsonProvider jsonProvider = new JacksonJsonProvider();
    private final MappingProvider mappingProvider = new JacksonMappingProvider();

    @Override
    public JsonProvider jsonProvider() {
        return jsonProvider;
    }

    @Override
    public MappingProvider mappingProvider() {
        return mappingProvider;
    }

    @Override
    public Set<Option> options() {
        return EnumSet.noneOf(Option.class);
    }
});

See 文档 https://github.com/jayway/JsonPath#jsonprovider-spi更多细节。

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

Jsonpath 与 Jackson 或 Gson 的相关文章

随机推荐

  • Dapper:是否可以自定义特定类型的特定字段的类型映射?

    假设我有这个User class public class User public int ID get set public string FirstName get set public string LastName get set
  • 检查给定的 PHAsset 是 iCloud 资产吗?

    我正在尝试获取 PhAsset 对象 我想隔离 iCloud 资产 这是我的代码 PHFetchResult cloudAlbums PHAssetCollection fetchAssetCollectionsWithType PHAss
  • 处理巨大的文本文件

    Problem 我有一个巨大的原始文本文件 假设有 3gig 我需要遍历文件中的每个单词 并找出某个单词在文件中出现了多少次 我建议的解决方案 将大文件拆分为多个文件 每个拆分文件都会按排序方式包含单词 例如 所有以 开头的单词a 将被存储
  • Three.js - 如何反序列化geometry.toJSON()? (geometry.fromJSON 在哪里?)

    我正在尝试卸载一些Geometry加载并处理到网络工作者中 要将其发送回主线程 Geometry实例需要序列化 看起来Geometry prototype toJSON 正是针对这种类型的事情 但我不知道如何将该对象转回Geometry主线
  • PHP 中比较 IP 地址与通配符的优化方法?

    任何人都知道一种有效且安全的方法来查看此输入是否 SERVER REMOTE ADDR 与类似于此不一致过滤器数组的内容匹配 请注意 200 100 可以仅表示为 200 100 并使用 表示的通配符 array 192 168 1 192
  • JavaFX:创建垂直菜单功能区

    我在这里试图完成的一个示例是 当您打开 Office Word 2013 文件并单击文件时 它会在左侧显示一个列表 Info New Open 有没有JavaFX成分像那样 我正在寻找一种 某物 列表 其项目垂直对齐 您可以单击执行某些操作
  • 自托管代理上的 Azure DevOps Python Pipeline Agent.ToolsDirectory 错误

    我有一个安装了 Python3 8 的自托管代理 我可以访问代理并运行 python 包的管道 我收到 Agent ToolsDirectory 与正确版本不匹配的错误 这是它输出的日志 Task 使用Python版本不会使用安装在托管代理
  • java.util.Date 与 java.sql.Date

    java util Date vs java sql Date 什么时候使用哪个以及为什么 恭喜 您已经解决了 JDBC 中我最讨厌的问题 日期类处理 基本上数据库通常至少支持three日期时间字段的形式 包括日期 时间和时间戳 其中每一个
  • 如何避免SQL中的“除以零”错误?

    我有这个错误消息 消息 8134 级别 16 状态 1 第 1 行 遇到除以零错误 编写 SQL 代码的最佳方式是什么 这样我就再也不会看到此错误消息了 我可以执行以下任一操作 添加一个 where 子句 使我的除数永远不为零 Or 我可以
  • Struts 1.3 中的多个提交按钮

    我的 JSP 中有以下代码
  • 在 Objective C 中使用 sizeof 等价物

    如何找到结构体的大小 sizeof 的使用在 Objective C 中不起作用 sizeof确实适用于struct在 Objective C 中 例如 size t pointsize sizeof NSPoint 另一方面 如果您对 O
  • Swiftui 中的 AsyncImage 不显示图像

    我在 TabView 中有 AsyncImage 当我这样做时 图像永远不会出现 我只看到进度条 available iOS 15 0 struct TEST View var body some View VStack TabView A
  • 为什么这个不同的“addSubView”代码会导致行为差异

    为什么将以下代码从旧条目更改为新条目可以修复以下问题 Code OLD Entry Did not work self window addSubview navigationController view NEW Entry Fixed
  • abs() 的错误操作数类型:“list”

    在计算数组每个值的绝对值时 我收到与 abs list 的错误操作数类型相关的错误 源代码失败的部分是下一个 x amplitudex sin 2 pi frequency 1 t phase y amplitudey sin 2 pi f
  • Oracle 基于函数的索引

    也许是一个愚蠢的问题 但是使用基于函数的索引是否安全 我的意思是 当列更改时索引会立即更改吗 假设它们设置正确 是的 概述 Oracle 在带有基于函数的索引的表上创建一个隐藏列 每次更改基于函数的索引的列时都会更新该隐藏列 假设这些值是确
  • Android 上的 Xamarin 表单选取器更改取消文本

    Android 上的 Xamarin Forms 单击选择器将打开对话框 否定按钮的默认文本为 取消 我怎样才能改变它 我查看了 Xamarin 的开源项目 他们设置了这样的肯定按钮文本 builder SetNegativeButton
  • C# 将程序添加到Windows启动(Windows 7)

    我试图通过将程序执行路径添加到注册表编辑器来将我的程序添加到 Windows 启动程序中 这是代码 RegistryKey registryKey Registry CurrentUser OpenSubKey SOFTWARE Micro
  • Android Webview 在三星和 Android 11 上崩溃

    这是我们在 Firebase 上看到的堆栈跟踪 Fatal Exception java lang RuntimeException Using WebView from more than one process at once with
  • Javascript Package 关键字的用途是什么?

    我正在阅读一些有关 JavaScript 保留关键字的在线材料 并且偶然发现了这个词package 我找不到任何清晰的在线材料可以解释它的用途 它是保留的 但不一定使用 好吧 至少在撰写本文时不是 以下内容被 ECMAScript 规范保留
  • Jsonpath 与 Jackson 或 Gson

    我收到一个大的 json 文档 我只想将其中的一部分解析到我的 java 类中 我正在考虑使用像 jsonpath 这样的东西从中提取部分数据 而不是创建 java 类的整个层次结构 Jackson 或 Gson 是否以任何方式支持 jso