外部 REST サービスからの JSON の取得
以前に、結果をテキストとして取得する方法について説明しましたが、実際には、このテキストは JSON ドキュメントです。 AL には JSON 型のサポートが組み込まれているため、ソリューションを修正すれば JSON ドキュメントを処理することができます。
JSON ドキュメントを操作するには、まずダウンロードしたテキスト値を JsonToken に解析する必要があります。 JsonToken データ型は、他のすべての JSON データ型の基本クラスです。 したがって、JsonToken データ型から ReadFrom 関数を使用して、入力データを JSON ドキュメントとして読み取り、解析することになります。 この関数は、入力データの JSON 構造が有効であることを示すブール値を返します。
次のコード例では、ResponseString 変数の値を JsonToken として解析する方法を示しています。 データは次から取得されています。
https://jsonplaceholder.typicode.com/users/<number>
次のコード例では、ユーザーへの JSON 応答を 5 の番号で示しています。
{
"id": 5,
"name": "Chelsey Dietrich",
"username": "Kamren",
"email": "Lucio_Hettinger@annie.ca",
"address": {
"street": "Skiles Walks",
"suite": "Suite 351",
"city": "Roscoeview",
"zipcode": "33263",
"geo": {
"lat": "-31.8129",
"lng": "62.5342"
}
},
"phone": "(254)954-1289",
"website": "demarco.info",
"company": {
"name": "Keebler LLC",
"catchPhrase": "User-centric fault-tolerant solution",
"bs": "revolutionize end-to-end systems"
}
}
応答テキストを JSON ドキュメントに解析するには、ReadFrom 関数を使用します。 前述の応答例からわかるように、JSON ドキュメントは配列ではなく、何らかのキーと値を持つ JsonObject です。 したがって、最初に JsonToken が JsonObject であることをテストしてから、AsObject 関数を使用して JsonObject データ型に変換します。 JsonObject データ型では、Get 関数を使用し、キーに基づいて値を取得できます。 この例は、名前キーに対する値を取得して、再び新しい JsonToken を生成します。 前述の応答例からわかるように、名前キーの値は JSON オブジェクトの最下位にある JsonValue と呼ばれるデータ型です。
この JsonToken は JsonValue に変換されます。 コンテンツはテキスト型であるため、AsText 関数を使用して、JsonValue をテキスト値に変換する必要があります。
procedure GetUserInformation(UserNumber: Integer)
var
Client: HttpClient;
ResponseMessage: HttpResponseMessage;
ResponseString: Text;
Jtoken: JsonToken;
Jtoken2: JsonToken;
JObject: JsonObject;
begin
if not Client.Get(StrSubstNo('https://jsonplaceholder.typicode.com/users/%1',
UserNumber), ResponseMessage) then
Error(ErrorInfo.Create('The call to the web service failed.'));
if not ResponseMessage.IsSuccessStatusCode() then
Error(ErrorInfo.Create('The web service returned an error message:\\' +
'Status code: ' + Format(ResponseMessage.HttpStatusCode()) +
'Description: ' + ResponseMessage.ReasonPhrase()));
ResponseMessage.Content().ReadAs(ResponseString);
if not Jtoken.ReadFrom(ResponseString) then
Error(ErrorInfo.Create('Invalid JSON document.'));
if not Jtoken.IsObject() then
Error(ErrorInfo.Create('Expected a JSON object.'));
JObject := Jtoken.AsObject();
if not JObject.Get('name', Jtoken2) then
Error(ErrorInfo.Create('Value for key name not found.'));
if not Jtoken2.IsValue then
Error(ErrorInfo.Create('Expected a JSON value.'));
Message(Jtoken2.AsValue().AsText());
end;
JSON データ型と HTTP データ型を使用すると、複数の関数を 1 つのコード行に連結できます。 追加する変数を JsonValue データ型で定義し、その変数に Jtoken.AsValue を割り当てる代わりに、このアクションを 1 つの実装で実行できます。
var
Jtoken: JsonToken;
Jvalue: JsonValue;
begin
Jvalue := Jtoken.AsValue();
Message(Jvalue.AsText());
// You can execute this in one line
Message(Jtoken.AsValue().AsText());
end;
次の例では、独自の JsonObject を作成し、HttpClient を使用して REST サービスに送信する方法を示します。 JsonObject データ型で Add 関数を使用して、新しいキーと値のペアを追加できます。 WriteTo 関数を使用すると、JsonObject をテキスト値にシリアル化することができます。
procedure CreatePost()
var
Client: HttpClient;
Content: HttpContent;
ResponseMessage: HttpResponseMessage;
ResponseString: Text;
JObject: JsonObject;
JsonText: Text;
begin
JObject.Add('userId', 2);
JObject.Add('id', 101);
JObject.Add('title', 'Microsoft Dynamics 365 Business Central Post Test');
JObject.Add('body', 'This is a MS Dynamics 365 Business Central Post Test');
JObject.WriteTo(JsonText);
Content.WriteFrom(JsonText);
if not Client.Post('https://jsonplaceholder.typicode.com/posts', Content,
ResponseMessage) then
Error(ErrorInfo.Create('The call to the web service failed.'));
if not ResponseMessage.IsSuccessStatusCode() then
Error(ErrorInfo.Create('The web service returned an error message:\\' +
'Status code: ' + Format(ResponseMessage.HttpStatusCode()) +
'Description: ' + ResponseMessage.ReasonPhrase()));
ResponseMessage.Content().ReadAs(ResponseString);
Message(ResponseString);
end;