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. w3cschool-Docker 入门到实践

    https://www.w3cschool.cn/reqsgr/ 什么是 Docker Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 ...

  2. Nibbles PG walkthrough Intermediate

    nmap nmap -p- -A 192.168.239.47 Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-15 02:26 UTC Nmap ...

  3. web95 比较麻烦的interval绕过

    审计 include("flag.php"); highlight_file(__FILE__); if(isset($_GET['num'])){ $num = $_GET['n ...

  4. AI编程:如何编写提示词

    这是小卷对AI编程工具学习的第2篇文章,今天讲讲如何编写AI编程的提示词,并结合实际功能需求案例来进行开发 1.编写提示词的技巧 好的提示词应该是:目标清晰明确,具有针对性,能引导模型理解问题 下面是 ...

  5. 从存钱罐到子数组:一个关于累加和的精妙问题|LeetCode 560 和为K的子数组

    LeetCode 560 和为K的子数组 点此看全部题解 LeetCode必刷100题:一份来自面试官的算法地图(题解持续更新中) 生活中的算法 你有没有这样的经历:每天往存钱罐里存一些零钱,某一天突 ...

  6. 正则表达式匹配邮箱,IP地址,URL

    参考链接: http://urlregex.com/ 1. 邮箱匹配正则表达式 C# ^(?(")(".+?(?<!\\)"@)|(([0-9a-z]((\.(?! ...

  7. redis - [06] redis-benchmark性能测试

    题记部分 001 || 参数含义 002 || 测试100个并发,100000个请求 启动redis-server redis-server /etc/redis.conf 进行性能测试 redis- ...

  8. JUC并发—15.红黑树详解

    目录 1.红黑树的定义性质和推论 2.红黑树的旋转操作 3.红黑树之添加结点的方法 4.红黑树之删除结点的方法一 5.红黑树之删除结点的方法二 1.红黑树的定义性质和推论 (1)红黑树的定义和性质 ( ...

  9. 【ABAQUS 二次开发笔记】Python 报错收集和解决方法

    1. 运行报错,找不到本地文件及模块.自定义模块 1.1 Example: $/home/tops/bin/python xxx.py Traceback (most recent call last ...

  10. Visio绘制时间轴安排图的方法

      本文介绍基于Visio软件绘制时间轴.日程安排图.时间进度图等的方法.   在很多学习.工作场合中,我们往往需要绘制如下所示的一些带有具体时间进度的日程安排.工作流程.项目进展等可视化图表.    ...