6

Delphi XE DataSnap REST サーバーを使用しており、JSON シリアル化されたオブジェクトを返そうとしています。メソッドがクライアントに返す結果は次のようになります。

{"type":"ServerMethodsUnit1.TJSONIssue",
 "id":1,
 "fields":{
           "FIssueNo":90210,
           "FTitle":"Beverly Hills...that''s where I want to be",
           "FKind":"Wishlist"
          }
}

整形式の JSON。

問題は、メッセージがクライアントによって受信されると、それに追加されたものがたくさんあり、次のようになることです。

{"result": ["{\"type\":\"ServerMethodsUnit1.TJSONIssue\",
              \"id\":1,
              \"fields\":{
                          \"FIssueNo\":90210,
                          \"FTitle\":\"Beverly Hills...that's where I want to be\",
                          \"FKind\":\"Wishlist\"}
             }
            "
           ]
}

"result"バックスラッシュ文字とそのタグが前 にたくさんあります。

なぜ私がこの余分なものを手に入れているのか、そしてそれを取り除く方法を誰かが知っているかどうか疑問に思っていました.

4

3 に答える 3

7

"result"タグを取り除くには、 のOnFormatResultイベントを使用する必要がありTDSHTTPWebDispatcherます。特に値Handled。の値Handledfalseデフォルトで です。に設定するtrueと、ユーザーに渡される結果は"result"JSON オブジェクトにラップされません。false の場合、このオブジェクトにラップされます。

例。次のようなコードがあります。

function TServerMethods1.EchoStringJSON(Value: string): TJSONObject;
var
  JSONObj : TJSONObject;
begin
  JSONObj := TJSONObject.Create;
  JSONObj.AddPair(TJSONPair.Create('name',Value));
  result := JSONObj;
end;

REST サービスの応答は次のようになります。{"result":[{"name":"asdfasdf"}]}

追加しHandled := true;ます:

procedure TWebModule1.DSHTTPWebDispatcher1FormatResult(Sender: TObject;
  var ResultVal: TJSONValue; const Command: TDBXCommand; var Handled: Boolean);
begin
  Handled := true;
end;

REST サービスの応答は次のようになります[{"name":"asdfasdf"}]

まだあります"[]"。そこで、いくつかの追加コードを追加します。

procedure TWebModule1.DSHTTPWebDispatcher1FormatResult(Sender: TObject;
  var ResultVal: TJSONValue; const Command: TDBXCommand; var Handled: Boolean);
var
  Aux: TJSONValue;
begin
  //remove [] element
  Aux := ResultVal;
  ResultVal := TJSONArray(Aux).Items[0];
  TJSONArray(Aux).Remove(0);
  Aux.Free;
  //we do not need "result" tag
  Handled := true;
end;

結果は次のようになります。{"name":"asdfasdf"}

PS。答えはここにあります:セクション FormatResult Event for REST Responses .

于 2014-05-26T06:09:55.583 に答える
4

投稿した JSON は、JSONObject ではなく文字列を返すリモート メソッドの結果を示しています。JSONObject を返す正しい方法は次のとおりです (コンパイル/テストされていません)。

function TMyRemote.GetSomething: TJSONValue;
begin
  Result := TJSONObject.Create;
  Result.Add("Name","Daniele Teti"); //used the overloaded version of add (string, string)
end;

これで、json が正しいはずです。結果文字列の RESULT 要素は設計どおりです。結果配列の最初の要素を読み取って、元の JSONObject を取得できます。

于 2011-01-29T22:47:02.863 に答える
2

Delphiデスクトップをクライアントとして使用していますか?はいの場合、Delphiは任意のリターンタイプをJSONに自動的に変換するため、メソッドから他のリターンを試すことができます。

例:returnDBXReaderはJSONタイプに変換されます

あなたが他のクライアント(php、java、flex)を持っている場合、私はあなたを助けることができません。同じ問題があります..JSONObjectをパラメーターとして受け取るメソッドを作成し、このメソッドを呼び出すための単純なPHPコードを実行しました...オブジェクトクラスを作成してサーバーに渡すと、JSONObjectをObjectに変換できません...UnMarshallの実行時にエラーが発生します。

私のテストはプリミティブ型で動作します!

于 2011-01-29T12:09:26.347 に答える