2011-01-28 12 views
6

私はDelphi XE DataSnap RESTサーバーを使用していて、JSONのシリアル化されたオブジェクトを返そうとしています。私のメソッドがクライアントに返された結果は、次のようになります。Delphi DataSnapフレームワークが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"タグを前面に表示します。

なぜ私はこの余分なものを手に入れているのか誰かが知っているのだろうと思っていました。

+0

JSONをダブルしているようですね。エスケープ文字(バックスラッシュ)は、JSON文字列の標準です。 –

答えて

2

Delphiデスクトップをクライアントとして使用していますか? DelphiはJSON

に任意の戻り値の型の自動変換を行うため、例えばはい多分あなたはあなたの方法から他の戻りを試すことができた場合:ケースでJSON形式

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

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

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を取得できます。

4

"result"タグを取り除くには、OnFormatResultというイベントをTDSHTTPWebDispatcherとする必要があります。特に値HandledHandledの値はデフォルトでfalseです。 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;を追加:[{"name":"asdfasdf"}]

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

RESTサービスの応答は次のようになります。

はまだ"[]"です。だから私はいくつかの追加のコードを追加します。{"name":"asdfasdf"}

PS:

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; 

は、今のようなルックスを引き起こします。答えはここにあります:section FormatResult Event for REST Responses

関連する問題