Chia sẻ qua


Làm việc với JSON trong Power Fx

Power Fx cho phép người tạo đọc JSON vào một Đối tượng chưa nhập bằng hàm ParseJSON.

Đọc và chuyển đổi giá trị

ParseJSON sẽ chuyển đổi chuỗi bản ghi JSON sau thành chuỗi đối tượng chưa được phân loại với các trường ItemName, Quantity, ReleaseDateAvailableForPreOrder.

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

Có thể truy cập từng trường bằng cách sử dụng ký pháp dấu chấm trên giá trị Đối tượng chưa nhập được trả về từ 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 ) );

Nói chung, ý tưởng là lệnh tốt để chuyển đổi rõ ràng giá trị của đối tượng chưa được phân loại sang một kiểu cụ thể. Đặt đối tượng chưa được phân loại làm giá trị biến cũng làm cho biến đó trở thành đối tượng chưa được phân loại . Vì vậy, có thể cần phải chuyển đổi giá trị đó một cách rõ ràng khi thiết lập thành một biến. Nhưng trong hầu hết các trường hợp, giá trị đối tượng chưa được phân loại sẽ tự động chuyển đổi thành một kiểu cụ thể ("ép buộc") khi được sử dụng làm tham số hàm khi kiểu là kiểu đơn giản như Boolean, số hoặc văn bản và hồ sơ tham số của hàm không có xung đột quá mức tiềm ẩn.

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

Ngoài việc tự động chuyển đổi kiểu trong các lệnh gọi hàm, các đối tượng không có kiểu cũng sẽ được chuyển đổi khi được gán cho các thuộc tính điều khiển, nếu có thể.

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

Và cuối cùng, khi sử dụng các toán tử như & hoặc +, một đối tượng chưa được phân loại sẽ bị ép buộc nếu không có sự mơ hồ về loại mong đợi.

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

Lưu ý

JSON không có kiểu GUID, Màu, Thời gian hoặc Ngày giờ . Các giá trị này được biểu diễn dưới dạng chuỗi. Nếu bạn gán trực tiếp giá trị JSON đối tượng chưa được phân loại chứa ngày cho thuộc tính văn bản, văn bản gốc của JSON sẽ được sử dụng. Điều này có thể quan trọng khi xử lý múi giờ, định dạng ngày, v.v. Trong những trường hợp như vậy, bạn nên chuyển đổi rõ ràng các giá trị bằng cách sử dụng GUID(), ColorValue(), DateValue(), DateTimeValue(), v.v.

Trong trường hợp tên trường bao gồm tên mã định danh không hợp lệ, chẳng hạn như khi tên trường bắt đầu bằng một số hoặc chứa các ký tự không hợp lệ, chẳng hạn như dấu gạch nối, thì bạn có thể đặt tên trường trong dấu trích dẫn đơn:

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

Power Fx sẽ không đánh giá sự tồn tại của trường cho đến khi công thức được chạy. Điều này cho phép tính linh hoạt trong JSON đến. Ví dụ: JSON trước đó đôi khi có thể chứa một trường bổ sung có tên là Discount. Nhưng trong ví dụ trước của chúng tôi, không có trường này. Việc viết công thức sử dụng trường Discount sẽ không gây ra bất kỳ lỗi nào trong quá trình tạo ứng dụng hoặc khi người dùng sử dụng ứng dụng. Nếu trường bị thiếu khi chạy công thức, thì giá trị đó sẽ chỉ dẫn đến giá trị Blank().

Lưu ý

JSON hỗ trợ null giá trị cho các trường. Những điều này cũng sẽ dẫn đến các giá trị Blank(). Hiện tại, không có sự khác biệt trong Power Fx giữa trường bị thiếu hoặc trường có giá trị null.

Vì việc truy cập các trường trên Đối tượng chưa nhập không được đánh giá khi viết công thức, nên cũng không có sẵn Intellisense nào. Cả JSONPower Fx đều phân biệt chữ hoa chữ thường, vì vậy hãy cẩn thận hơn khi viết tên trường.

Giá trị JSON không nhất thiết phải được viết theo kiểu ký hiệu bản ghi. JSON hợp lệ có thể chỉ là một giá trị, chẳng hạn như "text value", true hoặc 123.456. Trong trường hợp như vậy, Đối tượng chưa nhậpParseJSON trả về chính là giá trị còn ký pháp dấu chấm không được sử dụng.

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

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

Cuối cùng, JSON hỗ trợ các bản ghi lồng nhau. Việc chuyển đổi JSON thành Đối tượng chưa nhập như vậy sẽ tạo ra các đối tượng lồng nhau và ký pháp dấu chấm có thể được sử dụng để chuyển ngang hệ thống phân cấp.

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

Khi chuyển đổi chuỗi JSON này thành một biến Đối tượng chưa nhập có tên jsonObject, các trường có thể được truy cập bằng ký pháp dấu chấm.

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"

Nếu bất kỳ trường nào trong biểu thức ký pháp dấu chấm không tồn tại, thì Blank() sẽ được trả về.

Mảng và bảng

JSON có thể chứa các mảng giá trị hoặc bản ghi. Các mảng này có thể được truy cập trực tiếp hoặc chuyển đổi thành các bảng Power Fx .

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

JSON này chứa một bản ghi có trường có tên OrderLines chứa một mảng các bản ghi. Mỗi bản ghi có hai trường: ItemQuantity. Nếu JSON được chuyển đổi thành một Đối tượng chưa nhập bằng hàm ParseJSON và đặt thành một biến có tên jsonOrder, thì chúng ta có thể truy cập các dòng đơn hàng riêng lẻ theo nhiều cách.

Set( jsonOrder, ParseJSON( jsonStringVariable ) );

Bạn có thể truy xuất các bản ghi và giá trị riêng lẻ bằng hàm Index(). Ví dụ: để lấy bản ghi thứ hai trong trường OrderLines, hãy truy cập vào trường Quantity và chuyển đổi thành một giá trị.

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

Bạn có thể chuyển trực tiếp mảng các dòng đơn hàng thành một bảng. Điều này sẽ tạo một bảng một cột với một Đối tượng chưa nhập đại diện cho bản ghi.

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

Bảng một cột 'orderLines' bây giờ có cột 'Giá trị' đại diện cho Đối tượng chưa nhập. Để sử dụng bất kỳ trường nào từ bản ghi trong bảng này, hãy sử dụng ký pháp dấu chấm để truy cập trường JSON cụ thể trên Đối tượng chưa nhập trong cột Value.

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

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

Để sử dụng bản ghi dòng đơn hàng dễ dàng và đơn giản hơn trong các phần khác của ứng dụng, bạn có thể chuyển đổi toàn bộ Đối tượng chưa nhập thành bản ghi đã nhập hoàn toàn bằng hàm ForAll(). Việc cung cấp trực tiếp Đối tượng chưa nhập cho ForAll() có nghĩa là bạn có thể truy cập trực tiếp vào các trường đối tượng thay vì sử dụng trường Value một cột.

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

Biến typedOrderLines mới hiện là một bảng Power Fx được nhập đầy đủ với các cột và giá trị sau:

Mục Số lượng
"Tiện ích 1" 3
"Tiện ích 2" 5

Các ví dụ trước đây sử dụng mảng bản ghi, nhưng JSON cũng có thể chứa mảng chỉ có giá trị. Hãy xem xét ví dụ sau đây là một chuỗi JSON hợp lệ chứa một mảng gồm ba xâu.

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

Chúng ta có thể truy xuất một trong các mục từ mảng bằng hàm Index() và chuyển đổi thành văn bản.

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