Power Fx에서 JSON 작업

Power Fx는 제작자가 JSONParseJSON 함수를 사용하여 무형식 개체로 읽을 수 있도록 합니다.

값 읽기 및 변환

ParseJSON은 다음 JSON 레코드 문자열을 ItemName, Quantity, ReleaseDateAvailableForPreOrder 필드가 있는 무형식 개체로 변환합니다.

{
  "ItemName" : "Widget 1",
  "Quantity" : 46,
  "ReleaseDate" : "2022-09-01",
  "AvailableForPreOrder" : true
}

각 필드는 ParseJSON에서 반환된 무형식 개체 값의 점 표기법을 사용하여 액세스할 수 있습니다.

Set( untyped, ParseJSON( jsonStringVariable ) );

Set( item, Text ( untyped.ItemName ) );
Set( quantity, Value ( untyped.Quantity ) );
Set( release, DateValue ( untyped.ReleaseDate ) );
Set( preorder, Boolean ( untyped.AvailableForPreOrder ) );

일반적으로 형식화되지 않은 개체의 값을 특정 유형으로 명시적으로 변환하는 것이 좋습니다. 유형이 지정되지 않은 개체를 변수 값으로 설정하면 변수도 형식화되지 않은 개체가 됩니다. 따라서 변수로 설정할 때 이러한 값을 명시적으로 변환해야 합니다. 그러나 대부분의 경우 형식화되지 않은 개체 값은 유형이 부울, 숫자 또는 텍스트와 같은 단순 유형이고 함수의 매개 변수 프로필에 잠재적 충돌 오버로드가 없는 함수 매개 변수로 사용될 때 특정 유형으로 자동 변환("강제")됩니다. .

Left( untyped.ItemName, 1 ); // "W"
Radians( untyped.Quantity ); // 0.80285146
If (untyped.AvailableForPreOrder, "Available", "Not Available" ); // "Available"

함수 호출에서 유형을 자동으로 변환하는 것 외에도 형식화되지 않은 개체는 가능한 경우 컨트롤 속성에 할당될 때 변환됩니다.

Label1.Text: untyped.Quantity
InputText1.Default: untyped.ItemName

그리고 마지막으로 & 또는 +와 같은 연산자를 사용할 때 예상되는 유형에 모호성이 없으면 형식화되지 않은 개체가 강제됩니다.

untyped.Quantity + 1 // result is a number
untyped.ItemName & " (preorder)" // result is text
untyped.Quantity + untyped.Quantity // result is a number
untyped.Quantity & untyped.ItemName // result is text

노트

JSON에는 GUID, 색상, 시간 또는 날짜/시간 유형이 없습니다. 이러한 값은 문자열로 표시됩니다. 날짜가 포함된 JSON 형식화되지 않은 개체 값을 텍스트 속성에 직접 할당하면 JSON의 원본 텍스트가 사용됩니다. 이는 시간대, 날짜 형식 등을 처리할 때 중요할 수 있습니다. 이러한 경우 GUID(), ColorValue(), DateValue(), DateTimeValue() 등을 사용하여 값을 명시적으로 변환해야 합니다.

필드 이름이 잘못된 식별자 이름으로 구성된 경우(예: 필드 이름이 숫자로 시작하거나 하이픈과 같은 잘못된 문자가 포함된 경우) 필드 이름을 작은 따옴표로 묶을 수 있습니다.

untyped.'01'
untyped.'my-field'

Power Fx는 수식이 실행될 때까지 필드의 존재를 평가하지 않습니다. 이것은 들어오는 JSON에서 유연성을 허용합니다. 예를 들어, 이전 JSON에는 Discount라는 추가 필드가 포함될 수 있습니다. 그러나 이전 예에서 이 필드는 존재하지 않습니다. Discount 필드를 사용하는 수식을 작성하면 앱 제작 과정이나 사용자가 앱을 사용할 때 오류가 발생하지 않습니다. 수식을 실행할 때 필드가 없으면 값은 Blank() 값이 됩니다.

노트

JSON은 필드에 대해 null 값을 지원합니다. 또한 Blank() 값이 생성됩니다. 현재 Power Fx에서는 누락된 필드 또는 값이 null인 필드 간에 구분이 없습니다.

무형식 개체의 필드에 액세스하는 것은 수식을 작성할 때 평가되지 않으므로 Intellisense도 사용할 수 없습니다. JSONPower Fx 모두 대소문자를 구분하므로 필드 이름을 작성할 때 특히 주의하십시오.

JSON 값은 레코드 스타일 표기법일 필요는 없습니다. 유효한 JSON"text value", true 또는 123.456과 같은 값일 수 있습니다. 이 경우 ParseJSON가 반환하는 무형식 개체는 값 자체이며 점 표기법을 사용하지 않습니다.

Set( myText, Boolean( ParseJSON( "true" ) ) );

Set( myNumber, Value( ParseJSON( "123.456" ) ) );

이제 JSON은 중첩 레코드를 지원합니다. 이러한 JSON무형식 개체로 변환하면 중첩된 객체가 생성되고 점 표기법을 사용하여 계층 구조를 탐색할 수 있습니다.

{
  "Version" : 1,
  "RootElement" : {
    "Parent" : {
      "Name" : "This is the parent",
      "Child" : {
        "Name" : "This is the child"
      }
    }
  }
}

JSON 문자열을 jsonObject이라는 무형식 개체 변수로 변환할 때 점 표기법을 사용하여 필드에 액세스할 수 있습니다.

Set( jsonObject, ParseJSON( jsonStringVariable ) );

Set( parentName, Text( jsonObject.RootElement.Parent.Name ) ); // "This is the parent"

Set( childName, Text( jsonObject.RootElement.Parent.Child.Name ) ); // "This is the child"

점 표기법 표현식의 필드 중 하나라도 존재하지 않으면 Blank()가 반환됩니다.

배열 및 테이블

JSON은 값 또는 레코드의 배열을 포함할 수 있습니다. 이러한 배열은 직접 액세스하거나 Power Fx 테이블로 변환할 수 있습니다.

{
  "OrderNumber" : "SO000010",
  "CustomerID" : "CUST0126",
  "OrderLines" : [
    {
      "Item" : "Widget 1",
      "Quantity" : 3
    },
    {
      "Item" : "Widget 2",
      "Quantity" : 5
    }
  ]
}

JSON에는 레코드 배열이 포함된 OrderLines라는 필드가 있는 레코드가 포함되어 있습니다. 각 레코드에는 ItemQuantity의 두 필드가 있습니다. ParseJSON 함수를 사용하여 JSON무형식 개체로 변환하고 jsonOrder라는 변수로 설정하면 여러 가지 방법으로 개별 주문 라인에 액세스할 수 있습니다.

Set( jsonOrder, ParseJSON( jsonStringVariable ) );

Index() 함수를 사용하여 개별 레코드와 값을 검색할 수 있습니다. 예를 들어 OrderLines 필드에서 두 번째 레코드를 가져오려면 Quantity 필드에 액세스하여 값으로 변환합니다.

Set( line2Quantity, Value( Index( jsonOrder.OrderLines, 2 ).Quantity ); // 5

주문 라인 배열을 테이블로 직접 변환할 수 있습니다. 이렇게 하면 레코드를 나타내는 무형식 개체가 있는 단일 열 테이블이 생성됩니다.

Set( orderLines, Table( jsonOrder.OrderLines ) );

단일 열 테이블 'orderLines'에는 이제 무형식 개체를 나타내는 '값' 열이 있습니다. 이 테이블에 있는 레코드의 필드를 사용하려면 점 표기법을 사용하여 Value 열의 무형식 개체에 있는 특정 JSON 필드에 액세스합니다.

Set( jsonRecord, Index( orderLines, 2 ) ); // Get the second record in the table

Set( line2Item, Text( jsonRecord.Value.Item ) ); // "Widget 2"

앱의 다른 부분에서 주문 라인 레코드를 더 쉽고 간단하게 사용하려면 ForAll() 함수를 사용하여 무형식 개체 전체를 전체 유형 레코드로 변환할 수 있습니다. 무형식 개체ForAll()에 직접 제공하면 단일 열 Value 필드를 사용하는 대신 개체 필드에 직접 액세스할 수 있습니다.

Set( typedOrderLines, ForAll( jsonOrder.OrderLines, { Item : Text( ThisRecord.Item ), Quantity : Value( ThisRecord.Quantity ) } ) );

새로운 typedOrderLines 변수는 이제 다음 열과 값이 있는 완전히 형식화된 Power Fx 테이블입니다.

상품 수량
"위젯 1" 3
"위젯 2" 5

이전 예에서는 레코드 배열을 사용하지만 JSON에는 값만 배열로 포함될 수도 있습니다. 세 개의 문자열 배열을 포함하는 유효한 JSON 문자열인 다음 예를 고려하십시오.

[ "First Item", "Second Item", "Third Item"]

Index() 함수를 사용하여 배열에서 항목 중 하나를 검색하고 텍스트로 변환할 수 있습니다.

Text( Index( ParseJSON( jsonStringVariable ), 2 ) ) // "Second Item"