首页 > 其他分享 >学习unigui【27】像pg的jsonb一样编辑json。

学习unigui【27】像pg的jsonb一样编辑json。

时间:2024-06-03 11:43:44浏览次数:29  
标签:27 end unigui aValue JsonObject json CurrentObject TJSONObject FieldName

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;
    end;
  end;


  // 到达最后一级路径,设置值

  FieldName := FieldNames[High(FieldNames)];
  Pair := CurrentObject.Get(FieldName);
  if Pair = nil then
    CurrentObject.AddPair(FieldName, CreateJSONValueForVariant(NewValue)) // 自动根据NewValue类型创建JSONValue
  else
    Pair.JsonValue := CreateJSONValueForVariant(NewValue);

  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,有就更新,没有就创建。是否非常方便!

 

标签:27,end,unigui,aValue,JsonObject,json,CurrentObject,TJSONObject,FieldName
From: https://www.cnblogs.com/usegear/p/18228490

相关文章

  • 英语学习笔记27——Mrs. Smith‘s living room
    Mrs.Smith’slivingroom史密斯太太的客厅词汇Vocabularylivingroom客厅都成:living=liveing生活room屋子搭配:inthelivingroom在客厅文化:西方人一般都在起居室活动,所以客厅很大,一般可以一起聊天,看球,下棋什么的。near在……附近【不直接挨着】例......
  • golang json 性能分析
    Json作为一种重要的数据格式,具有良好的可读性以及自描述性,广泛地应用在各种数据传输场景中。Go语言里面原生支持了这种数据格式的序列化以及反序列化,内部使用反射机制实现,性能有点差,在高度依赖json解析的应用里,往往会成为性能瓶颈,从下面的火焰图中可以发现在业务逻辑处理......
  • 进程间通信(27000字超详解)
    ......
  • Nginx 1.26.0 爆 HTTP/3 QUIC 漏洞,建议升级更新到 1.27.0
    据悉,Nginx1.25.0-1.26.0主线版本中涉及四个与NGINXHTTP/3QUIC模块相关的中级数据面CVE漏洞,其中三个为DoS攻击类型风险,一个为随机信息泄漏风险,影响皆为允许未经身份认证的用户通过构造请求实施攻击。目前已经紧急发布NGINX开源版(稳定版)1.26.1和NGINX开源版(主线版......
  • css27 CSS Layout - width and max-width
    https://www.w3schools.com/css/css_max-width.asp CSSLayout-widthandmax-width  Usingwidth,max-widthandmargin:auto;Asmentionedinthepreviouschapter;ablock-levelelementalwaystakesupthefullwidthavailable(stretchesouttothelef......
  • form.is_valid()一直为False,且form.errors.as_json()为空
    form.is_valid()一直为False且form.errors.as_json()为空。这种情况通常是由于提交的数据未能正确绑定到表单字段。为了排查这个问题,需要逐步检查以下几个方面:检查HTML表单:确保HTML表单的输入字段名称与LoginForm中的字段名称匹配。确保表单的method属性设置为POST,并且包含{......
  • 1v1视频软件源码,通过jsonp跨域的代码分析
    1v1视频软件源码,通过jsonp跨域的代码分析通常为了减轻1v1视频软件源码web服务器的负载,我们把js、css,img等静态资源分离到另一台独立域名的服务器上,在html页面中再通过相应的标签从不同域名下加载静态资源,而被浏览器允许,基于此原理,我们可以通过动态创建script,再请求一个带参网址实......
  • UOJ#884. 【UR #27】509 号迷宫
    有一个显然的\(\mathcalO(n^2)\)DP。考虑利用组合数优化,只在满足纵坐标\(y|p\)的位置记录状态并转移。有障碍,需要做容斥。四种转移:线对线、点对点、线对点、点对线组合计数算明白了就简单了。代码#include<bits/stdc++.h>usingnamespacestd;constexprintN=......
  • 「杂题乱刷」P8279
    链接(Link)一个好题。就是说,你直接先求出这个数列的异或和,然后发现之后就可以两两匹配,如果无法匹配就默认这个数为\(0\),然后做完了。点击查看代码/*Tips:你数组开小了吗?你MLE了吗?你觉得是贪心,是不是该想想dp?一个小时没调出来,是不是该考虑换题?打cf不要用umap!!!记住......
  • 用.NET代码生成JSON Schema 验证器
    问题对于验证复杂JSON数据是否合法的需求,通常的解决方式是标准JSONSchema,.Net下有对应的JSONSchema实现库。应用程序通常需要将标准JSONschema传入实现库,来做后续的数据验证。这里有一种情况,就是如果使用者不太了解标准JSONSchema格式,但又希望能在自己的service中使用其强大......