文章目录

  • 第一章 Caché JSON 简介
  • 简介
  • Caché JSON功能
    • 在运行时创建和操作动态实体
    • 使用字符串JSON构造函数创建动态实体
    • 使用Caché动态表达式定义值
    • 在动态实体和规范JSON字符串之间进行转换
    • 链动态实体法
    • 迭代和数据类型发现
  • 动态实体方法概述
    • 创建、读取、更新、删除
    • 迭代和数组
    • 堆栈的功能
    • JSON序列化和反序列化
    • 数据类型信息

第一章 Caché JSON 简介

简介

Caché 和 Caché ObjectScript现在提供了对JSON的集成支持,一组快速、简单、强大的新特性允许像处理对象或表一样轻松地处理JSON数据结构:

  • 两个新类%Library.DynamicObject%Library.DynamicArray 。提供一种简单、有效的方法来封装和处理标准JSON数据结构。这些类的实例称为动态实体。
  • 使用新的JSON Caché ObjectScript语法,可以使用标准的Caché ObjectScript赋值语句而不是方法调用来在运行时创建和更改动态实体。对象属性和数组元素的值可以指定为JSON字符串文本,也可以指定为Caché ObjectScript动态表达式。
  • 动态实体包含用于JSON序列化(在动态实体和规范JSON格式之间进行转换)、迭代、数据类型、创建/读取/更新/删除操作和其他有用功能的方法。

Caché JSON功能

下面是一些新的JSON功能的例子:

在运行时创建和操作动态实体

可以创建动态实体,并定义一个任意的模式为他们在运行时:

/// d ##class(PHA.OP.MOB.Test).TestJson()
ClassMethod TestJson()
{set dynObject2 = ##class(%DynamicObject).%New()set dynObject2.SomeNumber = 42set dynObject2.SomeString = "a string"set dynObject1 = ##class(%DynamicObject).%New()set dynObject1.SomeNumber = 42set dynObject1.SomeString = "a string"w dynObject1.%ToJSON(),!set dynObject1.SomeArray = ##class(%DynamicArray).%New()set dynObject1.SomeArray."0" = "an array element"set dynObject1.SomeArray."1" = 123set dynObject1.SomeArray."2" =dynObject2w dynObject1.%ToJSON(),!
}
DHC-APP>d ##class(PHA.OP.MOB.Test).TestJson()
{"SomeNumber":42,"SomeString":"a string"}
{"SomeNumber":42,"SomeString":"a string","SomeArray":["an array element",123,{"SomeNumber":42,"SomeString":"a string"}]}DHC-APP>

使用字符串JSON构造函数创建动态实体

还可以通过分配一个文字JSON字符串来创建一个动态实体。文字JSON构造函数{}[]可以用来代替%New()构造函数。例如,可以使用set x=[]而不是set x=##class(%DynamicArray)来创建一个动态数组。与%New()不同,文字JSON构造函数也可以接受指定属性或元素的JSON文字字符串。这意味着可以用这些简单的赋值语句创建一个与前一个例子中的dynObject1相同的对象:

   set dynObject2 = {"SomeNumber":42,"SomeString":"a string"}set dynObject2.SomeArray = ["an array element",123]

本例为每个构造函数使用了一个语句,但是数组构造函数可以简单地嵌套在对象构造函数中。

为了证明dynObject1dynObject2是相同的,我们可以将它们显示为由%ToJSON()方法返回的序列化JSON字符串:

   write "object 1: "_dynObject1.%ToJSON(),!,"object 2: "_dynObject2.%ToJSON()object 1: {"SomeNumber":42,"SomeString":"a string","SomeArray":["an array element",123]}
object 2: {"SomeNumber":42,"SomeString":"a string","SomeArray":["an array element",123]}

使用Caché动态表达式定义值

包含在文字构造函数{}[]中的文本必须使用有效的JSON语法,但有一个例外。对于元素或属性的值,可以使用圆括号中的Caché表达式,而不是JSON文本。这个ObjectScript动态表达式(相当于set语句的右侧)将在运行时计算并转换为有效的JSON值。本例中的动态表达式包含对Caché $ZDATE函数的调用:

set dynObj = { "Date":($ZD($H,3)) }

当我们检索dynObject.Date时,动态表达式的计算值就会显示出来。

 write "Value of dynamic expression is: "_dynObject.DateValue of dynamic expression is: 2016-07-27
/// d ##class(PHA.OP.MOB.Test).TestJson()
ClassMethod TestJson()
{set dynObject2 = ##class(%DynamicObject).%New()set dynObject2.SomeNumber = 42set dynObject2.SomeString = "a string"set dynObj = { "Date":($ZD($H,3)) }set dynObject1 = ##class(%DynamicObject).%New()set dynObject1.SomeNumber = 42set dynObject1.SomeString = "a string"w dynObject1.%ToJSON(),!set dynObject1.SomeArray = ##class(%DynamicArray).%New()set dynObject1.SomeArray."0" = "an array element"set dynObject1.SomeArray."1" = 123set dynObject1.SomeArray."2" =dynObject2set dynObject1.SomeArray."2" =dynObjw dynObject1.%ToJSON(),!
}
DHC-APP>d ##class(PHA.OP.MOB.Test).TestJson()
{"SomeNumber":42,"SomeString":"a string"}
{"SomeNumber":42,"SomeString":"a string","SomeArray":["an array element",123,{"Date":"2020-02-09"}]}

在动态实体和规范JSON字符串之间进行转换

动态实体有序列化方法,允许将对象转换为JSON字符串。在下面的示例中,使用文字构造函数创建动态对象,并调用对象的%ToJSON()方法将其序列化为myJSONstring:

set myJSONstring = {"aNumber":(21*2),"aDate":($ZD($H,3)),"anArray":["string",123]}.%ToJSON()

这个序列化的JSON对象可以像任何其他字符串一样存储和检索。类方法%FromJSON()可以从任何源获取有效的JSON字符串并将其转换为动态对象。下面的代码将myJSONstring反序列化为动态对象myObject,并使用%ToJSON()来显示它:

 set myObject = ##class(%DynamicAbstractObject).%FromJSON(myJSONstring)write myObject.%ToJSON(){"aNumber":42,"aDate":"2016-08-29","anArray":["string",123]}

链动态实体法

一些动态实体方法可以被链接。本例创建了一个包含两个元素的动态数组,然后将%Push()方法链接起来,以向数组的末尾添加另外三个元素。最后一个链调用%ToJSON()显示序列化的字符串:

 set dynArray = ["a","b"]write dynArray.%Push(12).%Push({"a":1,"b":2}).%Push("final").%ToJSON()["a","b",12,{"a":1,"b":2},"final"]

迭代和数据类型发现

还提供了动态实体方法,用于迭代和数据类型发现等目的。这个例子创建了两个JSON字符串,将其中一个反序列化为dynEntity(任何一个都可以),然后为dynEntity获取一个迭代器:

 set arrayStr = [12,"some string",[1,2]].%ToJSON()set objectStr = {"a":12,"b":"some string","c":{"x":1,"y":2},"d":true,"e":1.1}.%ToJSON()set dynEntity = {}.%FromJSON(objectStr)set itr = dynEntity.%GetIterator()while itr.%GetNext(.key,.val) {write !,key_": "_"/"_val_"/, type: "_dynEntity.%GetTypeOf(key)}

对于while循环的每次迭代,%GetNext()将在key中返回属性名或数组索引,在val中返回成员值。

   while itr.%GetNext(.key,.val) {write !,key_": "_"/"_val_"/, type: "_dynEntity.%GetTypeOf(key)}a: /12/, type: number
b: /some string/, type: string
c: /5@%Library.DynamicObject/, type: object
d: /1/, type: boolean
e: /1.1/, type: number

动态实体方法概述

动态实体方法可分为以下几类:

创建、读取、更新、删除

  • %Set() 可以更改现有动态实体成员(属性或元素)的值,也可以创建新成员并为其赋值。
  • %Remove() 删除现有成员
  • %Get() 检索成员的值

迭代和数组

  • %GetIterator() 返回一个迭代器,其中包含指向动态实体每个成员的指针。
  • %GetNext() 返回迭代器标识的成员的键和值,并将光标移到下一个成员。
  • %Size() 返回成员数(包括数组中未分配的元素)。
  • %IsDefined() 测试成员是否具有指定的值。

堆栈的功能

  • %Push() 将新元素添加到动态数组的末尾。
  • %Pop() 删除数组的最后一个元素并返回其值。这些方法不适用于动态对象,因为对象属性不是按可预测的顺序存储的。

JSON序列化和反序列化

  • %FromJSON() 将JSON字符串转换为动态实体。
  • %ToJSON() 将动态实体序列化为规范JSON字符串。

数据类型信息

  • %GetTypeOf() 返回一个字符串,该字符串指示指定成员值的数据类型。%Set()%Push()提供一个可选的第三个参数来显式地指定值的数据类型。

第一章 Caché JSON 简介相关推荐

  1. 第一章 Caché 服务器页面简介 - 什么是CSP

    文章目录 第一章 Caché 服务器页面简介 - 什么是CSP CSP 和 Zen 在你开始之前 生产 `Web` 服务器和 `Caché` 提供的专用 `Web` 服务器 配置 `Web` 服务器和 ...

  2. 第二章 Caché JSON 创建和修改动态实体

    文章目录 第二章 Caché JSON 创建和修改动态实体 使用JSON文字构造器 使用动态表达式和点语法 使用点语法创建动态对象属性 使用点语法创建动态数组元素 使用 %Set(), %Get(), ...

  3. 第一章 Redis基础(简介+下载和安装+基本操作)----黑马

    第一章 Redis基础(简介+下载和安装+基本操作) ----黑马 文章目录 第一章 Redis基础(简介+下载和安装+基本操作) ----黑马 学习目标: 1. Redis 简介 1.1 NoSQL ...

  4. 第一章 Web MVC简介 —— 跟开涛学SpringMVC

    第一章 Web MVC简介 -- 跟开涛学SpringMVC Web MVC简介 1.1.Web开发中的请求-响应模型: 在Web世界里,具体步骤如下: 1.  Web浏览器(如IE)发起请求,如访问 ...

  5. 《深入理解 Spring Cloud 与微服务构建》第一章 微服务简介

    <深入理解 Spring Cloud 与微服务构建>第一章 微服务简介 文章目录 <深入理解 Spring Cloud 与微服务构建>第一章 微服务简介 一.单体架构及其存在的 ...

  6. 第一章 Web MVC简介 —— 跟开涛学SpringMVC 博客分类: 跟开涛学SpringMVC webmvcjavaeespring跟开涛学SpringMVC Web MVC简介 1.1、We

    第一章 Web MVC简介 -- 跟开涛学SpringMVC 博客分类: 跟开涛学SpringMVC webmvcjavaeespring跟开涛学SpringMVC Web MVC简介 1.1.Web ...

  7. 第一章 Caché 对象介绍

    文章目录 第一章 Caché 对象介绍 Caché 对象体系结构 类定义和类字典 创建类定义 类字典 Caché类库 开发工具 Caché Studio SQL-Based Development X ...

  8. 第一章 老虎Linux简介

    第一章 老虎Linux简介 第一章 老虎Linux简介1.简介2.讲师3.面向人群4.课程风格5.听课小建议6.联系我们吧 1.简介 老虎Linux主要讲解Linux及架构等一些相关知识,让大家从零开 ...

  9. 第四章 Caché JSON 处理数据类型

    文章目录 第四章 Caché JSON 处理数据类型 使用`%GetTypeOf()`返回值的数据类型 对象使用`%GetTypeOf` 对数组使用`%GetTypeOf` 区分数组或对象和`oref ...

最新文章

  1. Linux常用的20条运维命令,值得收藏!
  2. linux资源使用统计指南,指南:工作量分析文档
  3. struts2升级jar包遇到无法正常访问action的方法的问题
  4. C语言变量d的定义法则,C语言变量命名规则(3页)-原创力文档
  5. JavaScript之对象序列化详解
  6. PHP学习总结(9)——PHP入门篇之WAMPServer服务控制面板介绍
  7. 从微店到小程序店,微商仍是电商途中的苦行僧?
  8. 终端花屏后的恢复办法
  9. Linux查看内存的方法
  10. Arcgis地理加权回归
  11. 详解linux下的串口通讯开发
  12. 使用注册表关闭Windows 10 Defender
  13. 找100-200以内的质数
  14. 浅谈Word.Application,关于js操作word文档的使用
  15. C语言解析wav文件格式
  16. 大数据训练营课程大纲项目简介
  17. 回文数函数的粗浅理解
  18. 【刷题2022/5/3 用时160min】
  19. 通过SQL语句或数据库,生成数据库模型PDM方法详解
  20. Effective Java(第三版) 学习笔记 - 第四章 类和接口 Rule20~Rule25

热门文章

  1. Constraint of Oracle studing
  2. Chromium网页Layer Tree创建过程分析
  3. stopstart按钮怎么用_汽车Start-Stop启停技术简明讲解
  4. 危化园区信息化管理平台(附方案+源码)
  5. win10商店打不开解决办法
  6. 利用python进行股票分析(五)通过tushare读取股票数据
  7. 用Python海龟画图画哆啦A梦
  8. (转)一个大牛的acm历程(看着就要颤抖)
  9. 清风数学建模学习笔记——灰色关联分析(GRA)详细解读与案例分析
  10. gos-log高性能大日志检索中台