共用方式為


ParseJSON 函數

適用於: 畫布應用程式 Copilot Studio 模型導向應用程式 Power Platform CLI Dataverse 函數 Power Pages

解譯 JSON 字串,並在提供類型時傳回 動態值 或特定類型值。

重要

Description

此 ParseJSON 函式會剖析有效的 JSON 字串,並傳回代表 JSON 結構的 動態 值。

或者,使用第二個參數將 JSON 轉換為可在 Power Fx 公式中直接使用的類型化物件。 這使得結果更容易被使用,因為在使用時不再需要轉換和強制。 無類型 JSON 使用以下規則對應到類型:

  • 類型中 JSON 中不存在的欄位將以空白填入。
  • JSON 中不存在該類型的欄位將被忽略。
  • 同時屬於該類型和 JSON 的列,JSON 值必須可強制轉換為該類型。

ParseJSON如果文字不是有效的 JSON,則根據 ECMA-404IETF RFC 8259 中所述的 JavaScript 物件表示法 (JSON) 格式,函式可能會傳回錯誤。

語法

ParseJSONJSONString [ , 類型 ] )

  • JSONString – 必要項目。 以文字表示的 JSON 結構。
  • 類型——可選。 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: ParseJSON( “{ ”“r”“: 255, ”g“”: 128, “”b“”: 0, “a”“: 0.5 }” ) }, RGBA( 值( uo.r ), 值( uo.g ), 值( uo.b ), 值( uo.a ) ) )
貨幣、數字 { "numbervalue": 123.5 } 數字在 JSON 中直接表示,用點號 (.) 作為小數分隔符號。 value( ParseJSON(“{ ”“numbervalue”“: 123.5 }”).number值 )
日期、日期時間、時間 { "start": "2022-05-10" }
{ "start": "23:12:49.000" }
JSON 不具有日期或時間類型,因此只能將日期和時間以字串表示。 動態值可以直接從 ISO 8601 格式的字串轉換為日期、時間或日期時間。 如果是其他格式,請先使用 Text() 函式將 JSON 欄位轉換成文字,然後使用 DateValue(), TimeValue() or DateTimeValue() 函式,預設會使用目前使用者設定的語言。 DateValue( ParseJSON(“{ ”“appointment”“: ”“2022-05-10”“ }”).appointment )
DateValue( text( 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( Value( ParseJSON( “{ ”“status”“: 1 }” ).status ), 0, status.Open, 1, status.Closed )
錄製 { "field": "value" } 沒有從 JSON 物件直接轉換為記錄結構,但可以從 動態 值擷取個別欄位以形成記錄。 { field: Text( ParseJSON( “{ ”“field”“: ”“value”“ }” ).field ) }
記錄參考 n/a 記錄參考在資料來源中是唯一的,無法序列化或非序列化。 代表唯一索引鍵的欄位值可以在 JSON 中使用,以找出可在之後查詢的記錄。 n/a
資料表 [ { "id": 1, "name": "one" }, { "id": 2, "name": "two" } ]
[1, 2, 3]
JSON 可以包含可轉換為資料表的陣列。 這些值可以是記錄陣列,或是有效單一資料行資料表的值陣列。 ParseJSON() 陣列只能轉換為 動態 值的單列表,並且可以作為 Dynamic 值使用或使用 ForAll() 轉換為記錄的類型化表。 ForAll( table( 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”“: ”“這是文字”“ }”).stringField )
兩個選項 { "available": true }
{ "available": "Yes" }
兩個選項會以當地語系化字串呈現,並由布林值支援。 JSON() 函式會將兩個選項序列化為布林值。 無法直接從布林值、數字或字串轉換成兩個選項,但 Switch()If() 函式可用於文字、數字或布林值。 Switch( Boolean( ParseJSON( “{ ”“可用”“: true }” ).available ), false, Availability.No, true, 可用性.是 )

範例

存取欄位值

指定名為 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 )