4

JSON オブジェクトをサービス スタック サービスにポストし、リクエスト DTO で動的プロパティを使用したいと考えています。これまでに試したすべてのアプローチでは、オブジェクトは NULL 値のままです。

私が使用するJavaScriptコード:

$.getJSON(
  "/api/json/reply/Hello",
  {
    Name: "Murphy",
    Laws: {
      SomeProp: "A list of my laws",
      SomeArr: [
        { Title: "First law" },
        { Title: "Second law" },
        { Title: "Third law" }
      ]
    }   
},
function(data) {
    alert(data.result);
  }
);

リクエストを受け取る DTO:

public class Hello
{
    public string Name { get; set; }
    public dynamic Laws { get; set; }
}

また、DTO で動的ではなく、オブジェクトと JsonObject を使用しようとしました。

完全にするために、ここにもサービスがあります:

public class HelloService : Service
{
    public object Any(Hello request)
    {
        return new HelloResponse { Result = "Hello, " + request.Name };
    }
}

Murphy は問題なく Name プロパティを通過しますが、Laws プロパティは NULL のままです。

最後に、Laws プロパティを何らかの方法で (リフレクションを使用して) 反復処理し、含まれているすべてのプロパティと値を取得したいと考えています。

ここでは、型付き DTO を使用できません。なぜなら、開発時に Laws プロパティの JSON がわからないからです (そして、かなり頻繁に変更される可能性があります)。

助けてくれてありがとう!

4

1 に答える 1

5

NuGet 上の ServiceStack の .NET 3.5 ライブラリ ビルドには、.NET 4.0+動的型のネイティブ サポートがありません。JSON を文字列プロパティに渡し、サーバー上で動的に解析できます。

public object Any(Hello request)
{
    var laws = JsonObject.Parse(request.Laws);
    laws["SomeProp"] //
    laws.ArrayObjects("SomeArr") //
}

それ以外の場合はDictionary<string,string>、または AppHost で指定する場合に使用できます。

JsConfig.ConvertObjectTypesIntoStringDictionary = true;

objectオブジェクトを文字列辞書のように扱う which を使用できます。

それ以外の場合、動的はサービスが期待するものに関して無意味であるため、DTO 上にあるべきではありません。それを QueryString に追加するだけです。JSV 形式を使用して、QueryString で複雑なオブジェクト グラフを指定できます。

/hello?laws={SomeProp:A list of my laws,SomeArr:[{Title:First Law}]}

注: 上記のスペースは、ネットワーク上で でエンコードされ%20ます。

サービスで次の方法でアクセスできます。

public object Any(Hello request)
{
    var laws = base.QueryString["laws"].FromJsv<SomeTypeMatchingJsvSent>();
}
于 2013-03-20T16:52:37.953 に答える