JSON 函数

适用于: 画布应用 Copilot Studio 模型驱动应用 Power Platform CLI Dataverse 函数 Power Pages

JSON为表、记录或值生成文本字符串。

描述

该 JSON 函数将数据结构的 JavaScript 对象表示法(JSON)表示形式作为文本返回,以便它适合跨网络存储或传输。 [ECMA-404](https://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf 和 IETF RFC 8259 介绍了此格式,其已被 JavaScript 和其他编程语言广泛使用。

画布应用支持此表列出的数据类型,并提供有关其文本表示的详细信息:

数据类型 描述 结果示例
布尔 true 或 false。 true
颜色 包含颜色的 8 位十六进制表示形式的字符串。 此表示形式采用格式 #rrggbbaa,其中 rr 是红色分量,gg 是绿色,bb 是蓝色,aa 是 Alpha 通道。 对于 Alpha 通道,00 是完全透明,ff 是完全不透明。 您可以将此字符串传递到 ColorValue 函数。 "#102030ff"
货币 为用户语言使用适当的小数点分隔符的数字。 如果需要,将使用科学计数法。 1.345
日期 包含 ISO 8601 yyyy-mm-dd 格式的日期的字符串。 "2019-03-31"
DateTime 包含 ISO 8601 日期/时间的字符串。 以 UTC 表示的日期/时间值,如结尾的“Z”所示。 "2019-03-31T22:32:06.822Z"
GUID 包含 GUID 值的字符串。 字母为小写。 "751b58ac-380e-4a04-a925-9f375995cc40"
图片,媒体 如果指定了 JSONFormat.IncludeBinaryData,媒体文件将以字符串编码。 使用 http: 或 https: URL 架构的 Web 引用不会被修改。 对内存中二进制数据的引用以 "data:mimetype;base64,..." 格式编码。 内存中数据包括用户使用 Camera 控件捕获的图像,以及具有 appres: 和 blob: URL 架构的任何其他引用。 "data:image/jpeg;base64,/9j/4AA..."
编号 为用户语言使用适当的小数点分隔符的数字。 如果需要,将使用科学计数法。 1.345
选项集 选择项的数字值,不是用于显示的标签。 使用数字值是因为它与语言无关。 1001
时间 包含 ISO 8601 hh:mm:ss.fff 格式的字符串。 "23:12:49.000"
记录 字段及其值的逗号分隔列表,放在 { 和 } 之间。 此表示法类似于画布应用中的记录,但名称始终在双引号之间。 此格式不支持基于多对一关系的记录。 { "First Name": "Fred", "Age": 21 }
表 记录的逗号分隔列表,放在 [ 和 ] 之间。 此格式不支持基于一对多关系的表。 使用 JSONFormat.FlattenValueTables 选项,删除列名为 Value 的单列表的记录。 [ { "First Name": "Fred", "Age": 21 }, { "First Name": "Jean", "Age": 20 } ]
两种选择 双选项的布尔值(true 或 false),不是用于显示的标签。 使用布尔值是因为它与语言无关。 false
超链接,文本 双引号之间的字符串。 此函数用反斜杠转义嵌入的双引号,将换行符替换为“\n”,并进行其他标准 JavaScript 替换。 "This is a string."

指定可选的 Format 参数来控制结果的可读程度,以及不支持的数据类型和二进制数据类型的处理方式。 默认情况下,输出尽可能紧凑,没有不必要的空格或换行符,并且不允许不支持的数据类型和二进制数据。 如果您指定了 & 运算符,可以组合多种格式。

JSONFormat 枚举 描述
JSONFormat.Compact 默认。 输出尽可能紧凑,不增加空格或换行符。
JSONFormat.FlattenValue 表 作为 Value 表,[1,2,3] 表示法将生成一个包含记录的表,其中每条记录都有一个 Value 列。 在该表示法中 JSON,同一表示法表示三个数字的数组。 为了简化两者之间的互作性,此选项将 Power Fx Value 表平展为 JSON 友好数组而不是记录数组。
JSONFormat.IndentFour 为了提高可读性,输出为每个列和嵌套级别包含一个换行符,并为每个缩进级别使用四个空格。
JSONFormat.IncludeBinaryData 结果包含图像、视频和音频剪辑列。 此格式会大大增加结果的大小并降低应用的性能。
JSONFormat.IgnoreBinaryData 结果不包含图像、视频或音频剪辑列。 如果您既未指定 JSONFormat.IncludeBinaryData 也未指定 JSONFormat.IgnoreBinaryData,此函数将在遇到二进制数据时产生错误。
JSONFormat.IgnoreUnsupportedTypes 允许使用不受支持的数据类型,但结果不会包含这些数据类型。 默认情况下,不受支持的数据类型会产生错误。

使用 ShowColumns 和 DropColumns 函数可控制结果包含哪些数据并删除不支持的数据类型。

由于 JSON 内存和计算密集型,因此只能在 行为函数中使用此函数。 可以将结果捕获 JSON 到 变量中,然后可在数据流中使用。

如果列同时有显示名称和逻辑名称,结果将包含逻辑名称。 显示名称反映应用用户的语言,因此不适合将数据传输到通用服务。

语法

JSON( DataStructure [, Format ] )

  • DataStructure –必需。 要转换为 JSON的数据结构。 支持表、记录和基元值,任意嵌套。
  • 格式 - 可选。 JSONFormat 枚举值。 默认值为 JSONFormat.Compact,不添加换行符或空格,阻止二进制数据和不支持的列。

示例

分层数据

  1. 插入 Button 控件,并将其 OnSelect 属性设置为以下公式。

    ClearCollect( CityPopulations,
        { City: "London",    Country: "United Kingdom", Population: 8615000 },
        { City: "Berlin",    Country: "Germany",        Population: 3562000 },
        { City: "Madrid",    Country: "Spain",          Population: 3165000 },
        { City: "Hamburg",   Country: "Germany",        Population: 1760000 },
        { City: "Barcelona", Country: "Spain",          Population: 1602000 },
        { City: "Munich",    Country: "Germany",        Population: 1494000 }
    );
    ClearCollect( CitiesByCountry, GroupBy( CityPopulations, "Country", "Cities" ) )
    
  2. 按住 Alt 键,并选择此按钮。

    CitiesByCountry 集合已使用此数据结构创建,您可以通过在文件菜单上选择集合,然后选择集合的名称来显示该集合。

    CitiesByCountry 集合。

    您还可以选择设置>即将发布的功能>启用公式栏结果视图,在公式栏中选择集合的名称,然后选择公式栏下集合名称旁边的向下箭头,从而显示此集合。

    公式栏结果视图中的集合。

  3. 插入另一个按钮,并将其 OnSelect 属性设置为以下公式:

    Set( CitiesByCountryJSON, JSON( CitiesByCountry ) )
    

    此公式将全局变量 CitiesByCountryJSON 设置为 JSONCitiesByCountry 的表示形式。

  4. 按住 Alt 键,并选择此按钮。

  5. 插入 Label 控件,然后将 Text 属性设置为此变量。

    CitiesByCountryJSON
    

    标签将显示此结果,所有结果都在一行中,没有空格,适合跨网络传输:

    [
      {
        "Cities": [{ "City": "London", "Population": 8615000 }],
        "Country": "United Kingdom"
      },
      {
        "Cities": [
          { "City": "Berlin", "Population": 3562000 },
          { "City": "Hamburg", "Population": 1760000 },
          { "City": "Munich", "Population": 1494000 }
        ],
        "Country": "Germany"
      },
      {
        "Cities": [
          { "City": "Madrid", "Population": 3165000 },
          { "City": "Barcelona", "Population": 1602000 }
        ],
        "Country": "Spain"
      }
    ]
    
  6. 更改第二个按钮的公式,使输出更具可读性。

    Set( CitiesByCountryJSON, JSON(CitiesByCountry, JSONFormat.IndentFour ))
    
  7. 按住 Alt 键,并选择第二个按钮。

    标签将显示可读性更强的结果。

    [
      {
        "Cities": [
          {
            "City": "London",
            "Population": 8615000
          }
        ],
        "Country": "United Kingdom"
      },
      {
        "Cities": [
          {
            "City": "Berlin",
            "Population": 3562000
          },
          {
            "City": "Hamburg",
            "Population": 1760000
          },
          {
            "City": "Munich",
            "Population": 1494000
          }
        ],
        "Country": "Germany"
      },
      {
        "Cities": [
          {
            "City": "Madrid",
            "Population": 3165000
          },
          {
            "City": "Barcelona",
            "Population": 1602000
          }
        ],
        "Country": "Spain"
      }
    ]
    

base64 编码的图像和媒体

  1. 添加 Image 控件。

    这个控件带有 SampleImage。

  2. 添加 Button 控件,并将其 OnSelect 属性设置为以下公式。

    Set( ImageJSON, JSON( SampleImage, JSONFormat.IncludeBinaryData ) )
    
  3. 按住 Alt 键,并选择此按钮。

  4. 添加一个标签,然后将 Text 属性设置为此变量。

    ImageJSON
    
  5. 调整控件的大小,并根据需要减小字体大小,以显示大部分结果。

    该标签显示函数捕获的文本字符串 JSON 。

    "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjxzdmcgdmVyc2lvbj0iMS4xIg0KCSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczphPSJodHRwOi8vbnMuYWRvYmUuY29tL0Fkb2JlU1ZHVmlld2VyRXh0ZW5zaW9ucy8zLjAvIg0KCSB4PSIwcHgiIHk9IjBweCIgd2lkdGg9IjI3MHB4IiBoZWlnaHQ9IjI3MHB4IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNzAgMjcwIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCgk8ZyBjbGFzcz0ic3QwIj4NCgkJPHJlY3QgeT0iMC43IiBmaWxsPSIjRTlFOUU5IiB3aWR0aD0iMjY5IiBoZWlnaHQ9IjI2OS4zIi8+DQoJCTxwb2x5Z29uIGZpbGw9IiNDQkNCQ0EiIHBvaW50cz0iMjc3LjksMTg3LjEgMjQ1LDE0My40IDE4OC42LDIwMi44IDc1LDgwLjUgLTQuMSwxNjUuMyAtNC4xLDI3MiAyNzcuOSwyNzIiLz4NCgkJPGVsbGlwc2UgZmlsbD0iI0NCQ0JDQSIgY3g9IjIwMi40IiBjeT0iODQuMSIgcng9IjI0LjQiIHJ5PSIyNC4zIi8+DQoJPC9nPg0KPC9zdmc+"
    

Value 表

此公式:

JSON( [1,2,3] )

生成文本字符串 [{"Value":1},{"Value":2},{"Value":3}]。

JSONFormat.FlattenValueTables 选项也是同样的公式:

JSON( [1,2,3], JSONFormat.FlattenValueTables )

生成文本字符串 [1,2,3]。

请注意,当与 CityPopulations 或 CitiesByCountry 集合一JSON起使用时,FlattenValueTables 选项没有影响,因为这些表不是 Value 表。 Value 表只有一列,必须命名为“Value”。