ParseJSON 函数

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

解释 JSON 字符串,并在提供类型时返回 动态值 或特定类型化值。

重要提示

Description

该 ParseJSON 函数分析有效的 JSON 字符串并返回表示 JSON 结构的 动态 值。

可以选择使用第二个参数将 JSON 转换为可直接用于 Power Fx 公式的类型化对象。 这将使结果更易于使用,因为在使用时不再需要转换和强制。 使用以下规则将非类型化 JSON 映射到类型:

  • 类型中的列如果在 JSON 中不存在,则用空白填充。
  • JSON 中类型中不存在的列将被忽略。
  • 对于类型和 JSON 中都有的列,JSON 值必须与类型一致。

如果文本根据 ECMA-404IETF RFC 8259 中所述的 JavaScript 对象表示法(JSON)格式无效,该ParseJSON函数可能会返回错误。

语法

ParseJSONJSONString [ , 类型 ] )

  • JSONString – 必需。 以文本表示的 JSON 结构。
  • Type - 可选。 JSON 结构的 Power Fx 类型定义。 如果没有此参数, ParseJSON 则返回动态值;函数返回特定的类型化值。

转换动态值

如果没有第二个参数,则返回一个动态值,ParseJSON该值需要在支持的数据类型中显式转换字段值。 下表列出了 Power Apps 中的数据类型和对应的 JSON 数据类型以及如何转换。

数据类型 JSON 示例 Description 转换示例
布尔 { "bool": true } 布尔是 JSON 中的显式类型,可以直接转换。 布尔值( ParseJSON“{ ”“bool”:true })。bool )
Color { "color": "#102030" }
{ "r": 255, "g": 128, "b": 0, "a": 0.5 }
JSON 中没有颜色类型。 颜色值可以从 RGBA 整数或十六进制字符串创建。 ColorValue( ParseJSON(“{ ”“color”:“”#102030“” }“ )。color )
With( { uo: ({“”r“”: ParseJSON255, “”g“”: 128, “”b“”: 0, “a”: 0.5 }“ ) }, RGBA( Value( uo.r), Value( uo.g), Value( uo.b),Value(uo.b),Value(uo.a)
货币、数字 { "numbervalue": 123.5 } 数字在 JSON 中直接表示,用句点 ( . ) 作为小数分隔符。 Value( ParseJSON“{ ”“numbervalue”“: 123.5 }.numbervalue)
日期、日期/时间、时间 { "start": "2022-05-10" }
{ "start": "23:12:49.000" }
JSON 没有日期或时间类型,因此只能将日期和时间表示为字符串。 动态值可以直接从 ISO 8601 格式的字符串转换为日期、时间或日期时间。 对于其他格式,首先使用 Text() 函数将 JSON 字段转换为文本,然后使用默认将使用当前用户设置的语言的 DateValue()、TimeValue() 或 DateTimeValue() 函数。 DateValue( ParseJSON“{ ”“appointment”“: ”“2022-05-10”“ }.appointment)
DateValue(文本( ParseJSON“{ ”“appointment”“: ”“2022 年 5 月 5 日”“ }.appointment)
GUID { "id": "123e4567-e89b-12d3-a456-426655440000" } JSON 没有 GUId 的数据类型,因此它们只能表示为字符串。 GUID( ParseJSON“{ ”“id”: “”123e4567-e89b-12d3-a456-426655440000“” }.id)
超链接、图像和媒体 { "URI": "https://northwindtraders.com/logo.jpg" } 这些数据类型是文本数据类型,可以转换为文本,然后在 Power Apps 中使用。 Text( ParseJSON“{ ”“URI”“:”https://northwindtraders.com/logo.jpg"“ })。URI )
单选 { "status": 1 }
{ "status": "Closed" }
选择项显示为本地化字符串,数字为后备。 JSON() 函数将选择项序列化为其后备数字。 没有从数字或字符串到选择项的直接转换,但 Switch()If() 函数可用于文本或数字值。 Switch(值( ParseJSON“{ ”status“”: 1 }“ )状态,0,Status.Open,1,Status.Closed)
记录 { "field": "value" } 没有从 JSON 对象直接转换为记录结构,但可以从 动态 值检索单个字段以形成记录。 { field: Text( ParseJSON“{ ”“field”“: ”“value”“ }” 。field ) }
记录引用 记录引用是数据源特有的,不能序列化或反序列化。 表示唯一键的字段值可以在 JSON 中用于标识可以随后查找的记录。
[ { "id": 1, "name": "one" }, { "id": 2, "name": "two" } ]
[1, 2, 3]
JSON 可以包含数组,数组可以转换成表。 这些值可以是记录数组,也可以是实际上是单列表的值数组。 ParseJSON() 数组只能转换为 动态 值的单个列表,并且可以使用 ForAll()将数组转换为类型化的记录表。 ForAll(表( ParseJSON“[ { ”“id”“: 1, ”“name”“: ”“one”“ }, { ”“id”“: 2, ”name“”: “”two“} ]” ) ), { id: Value(ThisRecord.Value.id), name: Text(ThisRecord.Value.name) } )
文本 { "stringField": "this is text" } 文本是 JSON 中的显式类型,可以直接转换。 Text( ParseJSON(“{ ”“stringField”:“”this is text“” }.stringField )
两个选项 { "available": true }
{ "available": "Yes" }
两个选项显示为本地化字符串,布尔值为后备。 JSON() 函数将两个选项序列化为布尔值。 没有从布尔值、数字或字符串到两个选项的直接转换,但 Switch()If() 函数可用于文本、数字或布尔值。 Switch(Boolean( ParseJSON(“{ ”available“:true }” )。available)、false、Availability.No、true、Availability.Yes)

示例

访问字段值

假定在名为 JsonString 的变量中有以下 JSON 字符串

{ "parent": { "child": "text value" }, "number": 567 }
  1. 以下公式返回文本 text value
    Text( ParseJSON( JsonString ).parent.child )
    
  2. 以下公式返回数字 567
    Value( ParseJSON( JsonString ).number )
    

如果字段名称包含无效的标识符名称,您可以将字段名称放在单引号中。 假定在名为 JsonString 的变量中有以下 JSON 字符串

{ "0": { "child-field": "text value" } }
  1. 以下公式返回文本 text value
    Text( ParseJSON( JsonString ).'0'.'child-field' )
    

空白

假定在名为 JsonString 的变量中有以下 JSON 字符串

{ "text": "text value" , "number": 567, "empty": null }
  1. 尝试访问非现有字段将返回 Blank()。 以下公式返回 true
    IsBlank( Text( ParseJSON( JsonString ).parent.child ) )
    
  2. JSON null 值被视为 Blank()。 以下公式返回 true
    IsBlank( Text( ParseJSON( JsonString ).empty ) )
    

简单数组

假定在名为 JsonString 的变量中有以下 JSON 字符串

{ "array": [1, 2, 3] }
  1. 访问数组字段的 动态 值的单列表中的第二个数字并使用 Value() 返回的值 2转换为数字:
    Value( Index( ParseJSON( JsonString ).array, 2 ) )
    
  2. 将数组字段中 动态 值的单列表转换为单个列数字 { Value: 1 }, { Value: 2 }, { Value: 3 }表:
    ForAll( ParseJSON( JsonString ).array, Value( ThisRecord ) )
    

记录数组

假定在名为 JsonString 的变量中有以下 JSON 字符串

{ "array": [
    { "id": 1, "name": "One"},
    { "id": 2, "name": "Two"}
    ] }
  1. 可以使用 ForAll() 直接转换为类型化记录表,以便 ThisRecord.[fieldname] 访问 动态 字段并将其转换为特定类型:

    ForAll( ParseJSON( JsonString ).array, { id: Value(ThisRecord.id), name: Text(ThisRecord.name) })
    

数组到表

  1. 使用 Table() 函数将动态值转换为表会导致动态值的单列表。 然后需要使用 Value(单列)列访问对象,将其转换为前面所述的类型。

假定在名为 JsonString 的变量中有以下 JSON 字符串

{ "array": [1, 2, 3] }

Table() 返回包含数组中数字的单 列值的单 列值表...

 Set(untypedTable, Table( ParseJSON( JsonString ).array ));
 
 Value( Index(untypedTable, 1).Value.Value )
 ```

Given the following JSON string in a variable named `JsonString`
```JSON
{ "array": [
 { "id": 1, "name": "One"},
 { "id": 2, "name": "Two"}
 ] }

Table() 返回一个 动态 值的单列表,表示数组中的每个 json 对象。

  Set(untypedTable, Table( ParseJSON( JsonString ).array ) );
  
  Text( Index(untypedTable, 1).Value.name )