ParseJSON 函式

適用於 畫布應用程式 模型導向應用程式 Power Platform CLI

解譯 JSON 字串,並傳回 非類型化物件

Description

ParseJSON 函式將剖析有效的 JSON 字串,並傳回表示 JSON 結構的非類型化物件

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

語法

ParseJSON( JSONString )

  • JSONString – 必要項目。 以文字表示的 JSON 結構。

轉換非類型化物件資料類型

ParseJSON 會傳回非類型化物件,其需要在支援的資料類型中明確轉換欄位值。 下表列出 Power Apps 中的資料類型,和對應的 JSON 資料類型以及轉換方式。

資料類型 JSON 範例 描述 範例轉換
布林值 { "bool": true } 布林值是 JSON 中的明確類型,可以直接轉換。 Boolean( 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( Value( uo.r ), Value( uo.g ), 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() or DateTimeValue() 函式,預設會使用目前使用者設定的語言。 DateValue( ParseJSON("{ ""appointment"": ""2022-05-10"" }").appointment )
DateValue( Text( ParseJSON("{ ""appointment"": ""May 5, 2022"" }").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() 陣列只能轉換為非類型化物件的單一資料行資料表,並且可以按原樣使用或使用 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"": ""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() 傳回非類型化物件的單一資料行資料表,其中包含代表陣列中數字的單一資料行 Value...

 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 )