是否可以部分解码和更新 JSON? (去)

2024-03-17

我只需要解码和更新 json 对象的特定值。 问题是我不知道该对象的完整结构。 coding/json 包“忽略”/截断结构中未提供的字段,因此对这些字段进行编码会丢失。 我想知道是否可以只解组我知道的结构,更新它,然后编组它,而不截断/删除未知的结构/信息。


我知道这是一个很老的问题,但我学会了通常的结构和json.RawMessage会在这种情况下完成工作。让我分享一下。

要点是:将整个数据保存到raw字段,并将其用于编码/解码。其他字段可以从那里派生出来。

package main

import (
    "encoding/json"
    "log"
)

type Color struct {
    Space string
    raw   map[string]json.RawMessage
}

func (c *Color) UnmarshalJSON(bytes []byte) error {
    if err := json.Unmarshal(bytes, &c.raw); err != nil {
        return err
    }
    if space, ok := c.raw["Space"]; ok {
        if err := json.Unmarshal(space, &c.Space); err != nil {
            return err
        }
    }
    return nil
}

func (c *Color) MarshalJSON() ([]byte, error) {
    bytes, err := json.Marshal(c.Space)
    if err != nil {
        return nil, err
    }
    c.raw["Space"] = json.RawMessage(bytes)
    return json.Marshal(c.raw)
}

func main() {
    before := []byte(`{"Space": "YCbCr", "Point": {"Y": 255, "Cb": 0, "Cr": -10}}`)
    log.Println("before: ", string(before))

    // decode
    color := new(Color)
    err := json.Unmarshal(before, color)
    if err != nil {
        log.Fatal(err)
    }

    // modify fields of interest
    color.Space = "RGB"

    // encode
    after, err := json.Marshal(color)
    if err != nil {
        log.Fatal(err)
    }
    log.Println("after:  ", string(after))
}

输出应该是这样的:

2020/09/03 01:11:33 before:  {"Space": "YCbCr", "Point": {"Y": 255, "Cb": 0, "Cr": -10}}
2020/09/03 01:11:33 after:   {"Point":{"Y":255,"Cb":0,"Cr":-10},"Space":"RGB"}

注意:这不会保留按键顺序或缩进。

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

是否可以部分解码和更新 JSON? (去) 的相关文章

  • 使用 JSON 传递 HTML

    我正在使用 JSON 将数据传递到 iPhone 和 iPad 数据的一个字段是 HTML 问题是编码 这是我得到的回复 gt GadgetHTML strong Hello strong gt from Catworld br n img
  • APPLICATION_JSON 无法解析或不是字段

    我在应用程序中生成 JSON 时遇到问题 我正在尝试有关的教程通过 AngularJS 使用 Java Restful Web 服务 https www youtube com watch v F201AN5UEg0 我创建了一个动态 We
  • 如何将对象转换为 JSON 表示形式

    奇怪的是 我没有找到这个 将对象转换为 JSON 字符串的最简单方法是什么 对象图中的循环等边缘情况对我来说不太感兴趣 让我们找到 A 类简单情况的解决方案 其中包含 B C D 类的一些对象和一些基元 基本的收集支持是必须的 呵呵 我发现
  • 如何使用 JSON.NET 反序列化?

    如何设置 Newtonsoft Json net 将此文本反序列化为 NET 对象 US Hawaii GMT 10 00 Hawaii US Alaska GMT 09 00 Alaska 为了加分 这种结构在Json中叫什么 我尝试寻找
  • 在 Vue js 中获取 JSON 属性时出错

    我在使用 Vue js 时遇到了一个奇怪的行为 我进行 ajax 调用 将结果 一些 JSON 存储到名为 modello 的 Vue 数据属性中 lineaGialla selected false descrizione Questa
  • 无法从另一个标签的源代码构建和安装 go

    我正在尝试使用此从源代码构建和安装 go文档 https go dev doc install source 当我喜欢以下内容时 这效果很好 git clone https go googlesource com go goroot cd
  • 防止使用 golang 服务器访问文件夹中的文件

    我在 golang 中有一个服务器可以处理这样的文件夹路径 fs http FileServer http Dir assets http Handle Images fs http ListenAndServe 8000 nil 但在这个
  • 在 Go 中,如何将函数的 stdout 捕获到字符串中?

    例如 在 Python 中 我可以执行以下操作 realout sys stdout sys stdout StringIO StringIO some function prints to stdout get captured in t
  • 正则表达式不匹配

    我正在尝试以下代码 d byte x01 x00 x00 x00 x00 x00 x00 x00 x00 x00 x00 x80J x13 x80SQ x80L xe0 x80 x92 x80L x80H xe0 r regexp Must
  • 如何获取文件的 ctime、atime、mtime 并更改它们

    如何使用 Go 获取文件的 ctime mtime atime 并更改它们 在 Go 1 1 2 中 os Stat只能获取mtime os Chtimes 可以更改 mtime 和 atime 但不能更改 ctime Linux ctim
  • 与 Jackson 一起从 ASP.NET 反序列化日期

    我有一个 json 字符串 从 ASP NET Rest 服务返回 中的日期 如下所示 created Date 1277931782420 0700 杰克逊无法解析该日期 我可以编写自己的日期格式并将其传递给mapper getDeser
  • 将表类型添加到 JSON 编辑器

    我想了解的代码这个 JSON 编辑器 http mb21 github io JSONedit 并修改它 In 指令 js https github com mb21 JSONedit blob gh pages js directives
  • IE8 上 json 解析失败

    json gt 返回的响应 msg div p Unfortunately we were unable to process your application p br Please upload a CV br div status e
  • 如何在 ECMAScript 6 中导入 JSON 文件?

    如何访问 ECMAScript 6 中的 JSON 文件 以下不起作用 import config from config json 如果我尝试导入 JavaScript 文件 这可以正常工作 https www stefanjudis c
  • Ajax 调用 contentType: 'application/json' 不起作用

    我有一个 ajax 调用 它将表单数据发送到 php 函数 因为我读了很多使用contentType application json 这是最佳实践 我也想尝试一下 但不幸的是 我的脚本在使用时没有返回任何内容 如果我删除它 脚本就会执行它
  • 使用架构定义验证 JSON 对象

    只要我们可以根据预定义的模式 即 XSD 或 DTD 验证传入的 XML 文件 我们就可以对传入的 JSON 对象执行验证 有可用的 JSON 架构定义吗 有一个工作草案JSON 模式 http json schema org 您还可以看一
  • 无法使用 Python 循环分页 API 响应

    所以 我对这个感到摸不着头脑 使用 HubSpot 的 API 我需要获取我客户的 门户 帐户 中所有公司的列表 遗憾的是 标准 API 调用一次只能返回 100 家公司 当它返回响应时 它包含两个参数 使分页响应成为可能 其中之一是 ha
  • 无法封送,(实现encoding.BinaryMarshaler)。具有多个对象的 go-redis Sdd

    我有下面一段代码 我试图将一个数组添加到 redis 集中 但它给了我一个错误 package main import encoding json fmt github com go redis redis type Info struct
  • golang sql 驱动程序的准备语句

    关于golang的sql driver 下面两条语句有什么区别 store DB is sql DB type rows err store DB Query SQL args err nil defer rows Close and st
  • 从 Go Slice 中选择一个随机值

    情况 我有一些值 需要从中随机选择一个值 然后我想将它与固定字符串连接起来 到目前为止 这是我的代码 func main create the reasons slice and append reasons to it reasons m

随机推荐

  • 使用 .net 紧凑框架进行本地化

    我正在使用 NET Compact Framework 3 5 和 MS Visual Studio 2008 为移动设备 Windows CE 5 0 预装 NET Compact Framework 2 0 开发应用程序 我正在使用内置
  • 无法在 pandas 中使用 dropna 删除 NAN

    我将 pandas 导入为 pd 并运行下面的代码并得到以下结果 Code traindataset pd read csv Users train csv print traindataset dtypes print traindata
  • Javascript 中的多行警报

    这段代码 alert Hello again This is how we n add line breaks to an alert box 不起作用 Firefox JavaScript 控制台将错误命名为 未终止的字符串文字 并指向
  • 以编程方式设置 grunt 任务的选项?

    我有一个繁琐的任务 查看选项grunt option foo 如果我从以下位置调用此任务grunt task run my task 我怎样才能改变这些论点 我正在寻找类似的东西 grunt task run my task foo bar
  • 在条件执行之前从 NHibernate 条件获取 SQL 查询

    我有一个 NHibernate 标准 我需要从中获取 SQL 查询 我尝试了各种方法here https stackoverflow com questions 554481 how to get sql from hibernate cr
  • Polars 从日期时间对象中添加/减去 UTC 偏移量

    我想添加 减去UTC极坐标中日期时间对象的偏移量 通常以小时为单位 但我似乎没有找到实现此目的的方法 鉴于日历年中存在夏令时 UTC 偏移量可以是动态的 例如 EST EDT 映射到 5 4 小时UTC分别偏移 from datetime
  • 创建可以通过拖动背景区域中的任意位置来移动的非矩形表单

    我想通过左键单击并按住背景区域来移动表单窗口 就像我们通常使用标题栏一样 然后我还想将应用程序的表单窗口 即矩形窗口 更改为自定义设计的图形窗口 我在许多其他应用程序中看到过这种类型的窗口 所以我相信这是可能的 问题一 要允许在拖动其客户区
  • 如何使用 Cordova 处理文件?

    注意 此问题被重新发布 因为无论出于何种原因 原始发布者决定在提供并接受答案后将其删除 因此 我再次添加它以保存知识 原问题 我尝试在混合应用程序中使用 apache cordova api 从 localhost 8080 filenam
  • 如何从 CoNLL 格式转换为 spacy 格式

    我目前正在研究 NER 模型 我有一堆以 CoNLL 格式存储的数据 需要转换为 Spacy 格式 在 CoNLL 中 句子的每个单词旁边都有一个标签 在 Spacy 中 标签仅显示给具有实际标签的单词 我如何从下面的这种格式转换 CoNL
  • 为什么 clang 发出 32 位 float ps 指令来获取 64 位 double 的绝对值?

    clang为什么会转fabs double into vandps代替vandpd 就像海湾合作委员会那样 示例来自编译器资源管理器 https gcc godbolt org z TsfW9hrjT include
  • UTC 和 Etc/UTC 时区之间有区别吗?

    在 PHP 文档中 支持的时区列表 http php net manual en timezones others php UTC被列出两次 UTC Etc UTC 这两者之间有概念上的区别吗 或者它们只是同义词 简短回答 NO 有没有不同
  • JCL 安装到 Delphi 10 西雅图时出错

    我正在尝试将 JCL JVCL 安装到 Delphi 10 Seattle 中 我收到以下错误 使用 Embarcadero RAD Studio 10 西雅图 Embarcadero Delphi for Win32 编译器版本30 0
  • PHP 浮动使用的最佳实践

    我读过浮点指南 http floating point gui de languages php 关于在 PHP 中使用 float 类型 答案是使用 BC Math 扩展 使用字符串可以将浮点数表示为精确类型 并防止浮点数和整数问题 同时
  • 从 VBA 中的不同模块调用子例程

    是否可以从一个函数调用一个函数Module到另一个 我有以下代码 Sub MAIN Call IDLE End Sub MAIN位于Module1 IDLE位于Module2并定义为 Sub IDLE 在调用前加上 Module2 前缀 例
  • 使用 SUMO 场景的子集进行 OMNeT++ 网络模拟(使用 VEINS)

    我正在尝试使用 OMNeT Veins 和 SUMO 评估在车载网络上运行的应用程序 因为该应用程序依赖于现实的流量行为 所以我决定使用LuST场景 https github com lcodeca LuSTScenario 这似乎是此类数
  • glewInit() 失败,OpenGL 应用程序

    我正在尝试使用 glew glfw 构建一个 OpenGL 应用程序 我已经下载了二进制文件 将它们放在文件夹的根目录中 添加了 include 和 lib 目录的路径 并告诉我的项目需要 glew32 lib GLFW lib 和 ope
  • Delphi XE AnsiStrings 带有转义组合变音符号

    将包含转义组合变音标记 如 Fu u0308rst 的 Delphi XE AnsiString 转换为友好的 WideString F rst 的最佳方法是什么 我知道这并不总是适用于所有组合 但应该支持常见的拉丁语块 而无需自己构建愚蠢
  • WP7 - 水平滚动列表框的问题

    我需要一个水平滚动的列表框 并且我遵循了与此相关的其他几个问题提出的关于如何实现的建议 我目前所拥有的确实水平滚动 但在滑动结束时 它不会停留在我滚动到的位置 它会恢复到原始显示 有点像它的一块松紧带 在滑动后返回到其原始位置它被拉伸了 我
  • 使用dispatchEvent获得焦点事件

    当我触发一个focus事件与dispatchEvent在输入框上 其onfocus被调用 但在 UI 上输入框未获得焦点 这种行为有什么原因吗 var test document getElementById test test onfoc
  • 是否可以部分解码和更新 JSON? (去)

    我只需要解码和更新 json 对象的特定值 问题是我不知道该对象的完整结构 coding json 包 忽略 截断结构中未提供的字段 因此对这些字段进行编码会丢失 我想知道是否可以只解组我知道的结构 更新它 然后编组它 而不截断 删除未知的