ParseJSON 函式
適用於:畫布應用程式
模型導向應用程式
Power Pages
Power Platform CLI
解釋 JSON 字串並傳回非類型化物件或類型化物件。
重要
- 使用 ParseJSON 的第二個參數轉換為類型化物件是一項實驗性功能。
- 實驗性功能不供生產時使用,而且可能功能受限。 這些功能是在正式發行前先行推出,讓您能夠搶先體驗並提供意見反應。 其他資訊:了解畫布應用程式中的實驗性、預覽及已淘汰功能
- 只有在使用者定義型別實驗性功能已於設定 > 即將推出的功能 > 實驗性中開啟 (預設為關閉狀態) 時,才能使用本文所述的行為。
- 您的意見反應對我們非常有價值。 請告訴我們您對 Power Apps 實驗性功能社群論壇的想法。
Description
ParseJSON 函數解析有效的 JSON 字串並傳回表示 JSON 結構的非類型化物件。
或者,使用第二個參數將 JSON 轉換為可在 Power Fx 公式中直接使用的類型化物件。 這使得結果更容易被使用,因為在使用時不再需要轉換和強制。 無類型 JSON 使用以下規則對應到類型:
- 類型中 JSON 中不存在的欄位將以空白填入。
- JSON 中不存在該類型的欄位將被忽略。
- 同時屬於該類型和 JSON 的列,JSON 值必須可強制轉換為該類型。
如果文字不是根據 ECMA-404 和 IETF RFC 8259 中描述的 JavaScript 物件表示法 (JSON) 格式的有效 JSON,則 ParseJSON 函數可能會傳回錯誤。
語法
ParseJSON( JSONString [ , Type ] )
- JSONString – 必要項目。 以文字表示的 JSON 結構。
- 類型——可選。 JSON 結構的 Power Fx 類型定義。 如果沒有這個參數,ParseJSON 將會傳回一個無型別物件;使用它並且函數傳回一個強類型物件。
轉換非類型化物件資料類型
如果沒有第二個參數,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 }
- 以下公式會傳回文字
text value
:Text( ParseJSON( JsonString ).parent.child )
- 以下公式會傳回數字
567
:Value( ParseJSON( JsonString ).number )
在案例中,如果功能變數名稱由不正確識別碼名稱所組成,您可以將功能變數名稱放在單引號中。
指定名為 JsonString
變數中的以下 JSON 字串
{ "0": { "child-field": "text value" } }
- 以下公式會傳回文字
text value
:Text( ParseJSON( JsonString ).'0'.'child-field' )
空白
指定名為 JsonString
變數中的以下 JSON 字串
{ "text": "text value" , "number": 567, "empty": null }
- 嘗試存取非現有欄位時,會傳回 Blank()。 下列公式會傳回
true
:IsBlank( Text( ParseJSON( JsonString ).parent.child ) )
- JSON
null
值視為 Blank()。 下列公式會傳回true
:IsBlank( Text( ParseJSON( JsonString ).empty ) )
簡單陣列
指定名為 JsonString
變數中的以下 JSON 字串
{ "array": [1, 2, 3] }
- 存取非類型化物件 的陣列單一資料行資料表中的第二個數字,並使用 Value() 轉換為數字傳回
2
:Value( Index( ParseJSON( JsonString ).array, 2 ) )
- 將陣列欄位中非類型化物件的單一資料行資料表轉換為數字的單一資料行資料表
{ Value: 1 }, { Value: 2 }, { Value: 3 }
:ForAll( ParseJSON( JsonString ).array, Value( ThisRecord ) )
記錄陣列
指定名為 JsonString
變數中的以下 JSON 字串
{ "array": [
{ "id": 1, "name": "One"},
{ "id": 2, "name": "Two"}
] }
使用 ForAll() 直接轉換為類型化資料表的記錄,可以藉由使用
ThisRecord.[fieldname]
存取非類型化物件欄位來完成,然後再將這些記錄轉換為已知類型:ForAll( ParseJSON( JsonString ).array, { id: Value(ThisRecord.id), name: Text(ThisRecord.name) })
陣列至資料表
- 使用 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 )