var
  I: Integer;
  CurrentObject: TJSONObject;
  FieldName: string;
  Pair: TJSONPair;
function CreateJSONValueForVariant(const aValue: Variant): TJSONValue;

begin
  case VarType(aValue) of
    varInteger:
      Result := TJSONNumber.Create(Integer(aValue)); // 直接为整数创建TJSONNumber
    varSingle, varDouble:
      Result := TJSONNumber.Create(Double(aValue)); // 对于单精度和双精度浮点数,直接传入Value
    varString:
      Result := TJSONString.Create(string(aValue));
    varBoolean:
      Result := TJSONBool.Create(aValue);
    else
       raise Exception.CreateFmt('Unsupported variant type encountered: %s', [VarToStr(aValue)]); // 更详细的错误信息

  end;
end;

begin
  CurrentObject := JsonObject;
  for I := Low(FieldNames) to High(FieldNames) - 1 do
  begin
    FieldName := FieldNames[I];
    if not CurrentObject.TryGetValue(FieldName, CurrentObject) or not (CurrentObject is TJSONObject) then
    begin
      // 如果路径段不存在或不是对象,则创建一个新的对象
      CurrentObject.AddPair(FieldName, TJSONObject.Create);
      CurrentObject := CurrentObject.Values[FieldName] as TJSONObject;
    end
    else
    begin
      // 继续深入到下一个路径段
     // CurrentObject := CurrentObject.Values[FieldName] as TJSONObject;

      if CurrentObject.Values[FieldName] is TJSONObject then
      begin
        CurrentObject := CurrentObject.Values[FieldName] as TJSONObject;
      end
      else
      begin
        // 如果不是对象,则不应该继续遍历,直接跳出循环
        Break;
      end;

    end;
  end;

  // 到达最后一级路径,设置值
  if Assigned(CurrentObject) then
  begin
    FieldName  := FieldNames[High(FieldNames)];
    Pair := CurrentObject.Get(FieldName);
    if Pair = nil then
      CurrentObject.AddPair(FieldName, CreateJSONValueForVariant(NewValue)) // 自动根据NewValue类型创建JSONValue
    else
      Pair.JsonValue := CreateJSONValueForVariant(NewValue);

    end;

  Result := JsonObject;
end;
调用:

  var JsonObject : TJSONObject;
JsonObject := TJSONObject.ParseJSONValue('{}') as TJSONObject;
JsonObject :=TSQLHelp.UpdateNestedJSONField(JsonObject, ['person', 'age'], Integer(30));//注意这里,否则不识别导致异常
ShowMessage(JsonObject.ToString);

根据path:['person', 'age']检查json,有就更新,没有就创建。是否非常方便!

json有值,就修改:

  var JsonObject : TJSONObject;
JsonObject := TJSONObject.ParseJSONValue('{"person":{"name":"John","age":90,"address":{"city":"New York","country":"USA"}}}') as TJSONObject;
JsonObject :=TSQLHelp.UpdateNestedJSONField(JsonObject, ['person', 'age'], Integer(30));
ShowMessage(JsonObject.ToString);

  var JsonObject : TJSONObject;
JsonObject := TJSONObject.ParseJSONValue('{"person":{"name":"John","age":90,"address":{"city":"New York","country":"USA"}}}') as TJSONObject;
JsonObject :=TSQLHelp.UpdateNestedJSONField(JsonObject, ['person', 'age'], Integer(30));
JsonObject :=TSQLHelp.UpdateNestedJSONField(JsonObject, ['接触暴露', '皮肤','破损'], True);
ShowMessage(JsonObject.ToString);

have fun

学习unigui【27】像pg的jsonb一样编辑json。的更多相关文章

  1. Qt 学习之路 2(58):编辑数据库外键

    Qt 学习之路 2(58):编辑数据库外键(skip) 豆子 2013年7月12日 Qt 学习之路 2 13条评论 前面几章我们介绍了如何对数据库进行操作以及如何使用图形界面展示数据库数据.本章我们将 ...

  2. 2.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:

    转自:https://www.cnblogs.com/ssslinppp/p/4528892.html 个人认为,使用@ResponseBody方式来实现json数据的返回比较方便,推荐使用. 摘要 ...

  3. WPF学习12:基于MVVM Light 制作图形编辑工具(3)

    本文是WPF学习11:基于MVVM Light 制作图形编辑工具(2)的后续 这一次的目标是完成 两个任务. 本节完成后的效果: 本文分为三个部分: 1.对之前代码不合理的地方重新设计. 2.图形可选 ...

  4. WPF学习11:基于MVVM Light 制作图形编辑工具(2)

    本文是WPF学习10:基于MVVM Light 制作图形编辑工具(1)的后续 这一次的目标是完成 两个任务. 画布 效果: 画布上,选择的方案是:直接以Image作为画布,使用RenderTarget ...

  5. [原创]java WEB学习笔记27:深入理解面向接口编程

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  6. iOS阶段学习第27天笔记(UIButton-UIImageView的介绍)

    iOS学习(UI)知识点整理 一.关于UIButton的介绍 1)概念:UIButton 是一种常用的控件,通过点击触发相应的功能 2)UIButton 的几种常用的状态        1.UICon ...

  7. 我的android学习经历27

    前几天忙着学校的互联网+项目比赛,没有时间学习android和发一些东西,主要是这两天太累了,我是项目组长,好多东西去弄,今天已经交稿去进行初赛. 马上收拾收拾心情,继续我的andorid菜鸟之路 加 ...

  8. Kali学习笔记27:Burpsuite(上)

    文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 如果我只能选择一款工具进行Web渗透,那么一定就是Bu ...

  9. (数据科学学习手札27)sklearn数据集分割方法汇总

    一.简介 在现实的机器学习任务中,我们往往是利用搜集到的尽可能多的样本集来输入算法进行训练,以尽可能高的精度为目标,但这里便出现一个问题,一是很多情况下我们不能说搜集到的样本集就能代表真实的全体,其分 ...

  10. Linux下汇编语言学习笔记27 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

随机推荐

  1. Nodify学习 二:添加节点

    Nodify学习 一:介绍与使用 - 可乐_加冰 - 博客园 (cnblogs.com) Nodify学习 二:添加节点 - 可乐_加冰 - 博客园 (cnblogs.com) 添加节点(nodes) ...

  2. 冠军!天翼云在国际AI顶会大模型挑战赛中拔得头筹!

    6月7日,国际人工智能顶会CVPR 2023举办的第一届大模型挑战赛(CVPR 2023 Workshop on Foundation Model:1st foundation model chall ...

  3. Akka中使用Logback日志框架

    Akka提供的默认日志系统只输出到控制台,这种日志系统不可以用到产品环境,当然你可以整合SLF4J这样的日志系统,下面介绍如何在Akka中使用Logback记录日志. 1. 创建Maven工程引入相关 ...

  4. 多个tomcat启停脚本server.sh

    vi server.sh #!/bin/bash export JAVA_HOME=/u01/java_home/jdk1.8.0_181 export JRE_HOME=${JAVA_HOME}/j ...

  5. vim技巧:设置编码格式,批量注释(待续其他功能)

    navicate导出的sql由于是win平台所有模式都是dos所以上传到服务器需要更改模式类型为unix :set ff 查看当前文本的模式类型,一般为dos,unixdos 代表windows转出类 ...

  6. Linux驱动---字符设备

    目录 一.基础简介 1.1.Linux设备驱动分类 1.2.字符设备驱动概念 二.驱动基本组成 2.1.驱动模块的加载和卸载 2.2.添加LICENNSE以及其他信息 三.字符设备驱动开发步骤 3.1 ...

  7. Linux环境Docker使用代理推拉镜像

    闲扯几句 不知不觉已经2月中了,1个半月忙得没写博客,这篇其实很早就想写了(可追溯到Docker刚刚无法拉镜像的时候),由于工作和生活上的事比较多又在备考软考架构,拖了好久-- 简单记录下怎么做的,以 ...

  8. swiper8.x在vue中的wtf

    首先我是想开启鼠标滚动的效果,在官网上发现如下说法 引入就引入吧,引入路径还不说,在网上看其他教程发现路径是 引入完了,怎么办呢,又不会了,官网没有教程,网上的教程全是关于vue-awesome-sw ...

  9. ADF - [01] 概述

    大数据需要可以启用协调和操作过程以将这些巨大的原始数据存储优化为可操作的业务见解的服务. Azure 数据工厂是专为复杂的混合提取-转换-加载 (ETL).提取-加载-转换 (ELT) 和数据集成项目 ...

  10. MySQL - [17] Oracle、SQLServer、MySQL数据类型对比

    题记部分 一.数据类型对比 对应关系 (1)整数类型 Oracle的NUMBER(*,0) 对应 SQL Server的INT 和 MySQL的INT Oracle的BIGINT 可能需要映射到SQL ...