8

私が取り組んでいるプロジェクトでは、未定義の JSON を含むことができる DataContract が必要です。

DataMember は、クライアントにとってのみ意味のある JSON です。クライアントが不明な json を送信できるようにしたいと考えています。

例:

public class Contract
{
    [DataMember]
    public int clientId;
    [DataMember]
    public string json;
}

明らかに、そのように定義されたコントラクトを持つ場合、クライアントは次のように json をエスケープする必要があります。

{
    "clientId":1,
    "json": "{\"test\":\"json\"}"
}

明らかに、これは私たちが必要としているものではありません。クライアントが送信する必要がある json は次のようになります。

{
    "clientId":1,
    "json": {"test":"json"}
}

調査した可能な解決策:

  1. Stream をリクエストの本文のコントラクト パラメーターとして使用します。動作しますが、フレームワークを使用するのではなく、私たちの側で作業を行います。
  2. 「json」を DynamicObject として定義します。動作しません。適切に書き込まれたプロパティを取得できませんでした。
  3. Newtonsoft ライブラリを使用して、WCF エンドポイントの既定のコントラクト シリアライザーを変更し、すべての入力を JObject にシリアル化します。リクエストのシリアル化も処理する必要があり、アプリケーションで問題が発生します。この方法は避けたいと思います。

誰にもこの問題の解決策がありますか?

編集

このサービスは、残りの json リソースを提供します。これは、webHttpBinding を使用して単一のエンドポイントを定義します。操作は次のように定義されます (簡単にするために省略されています)。

[WebInvoke(Method = "POST", UriTemplate = "...", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
[OperationContract]
Stream Create(Contract c);

また、サービスは次の属性で装飾されています。

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]

ありがとうございました。JF

4

5 に答える 5

3

WCF (4.5 以降) は、データ コントラクトの一部として任意の JSON を逆シリアル化することをサポートしていません。それを行う別のシリアライザーを使用する必要があります.JSON.NETは私が個人的に好きなものです. シリアライザーを変更できるようにするには、別のメッセージ フォーマッターを使用できます。 %20and%20serialization%20formats%20in%20WCF WCF で使用される既定のシリアル化を JSON.NET に置き換えるサンプルがあります。

そのライブラリを使用して任意の JSON を受け取るには、「json」プロパティのタイプを、JSON.NET の任意の JSON に相当する JToken に変更する必要があることに注意してください。

public class Contract 
{ 
    [DataMember] 
    public int clientId; 
    [DataMember] 
    public Newtonsoft.Json.Linq.JToken json; 
} 
于 2012-10-16T22:29:41.627 に答える
0

これを試しましたか?

public class Contract 
{ 
    [DataMember] 
    public int clientId; 
    [DataMember] 
    public Dictionary<string,string> DynamicProperties; 
}
于 2012-10-16T18:09:45.487 に答える
0

ストリームを受け入れるように署名を変更します。例えば:

public String ProcessJson(Stream jsondata)
{
//play with jsondata

}

ストリームとして受信するには、WebContentTypeMapper メソッドをオーバーライドします。

 public class RawWebContentTypeMapper : WebContentTypeMapper 
    {
        public override WebContentFormat GetMessageFormatForContentType(string contentType)
        {            
                return WebContentFormat.Raw;       
        }   
    }
于 2014-06-11T10:24:29.797 に答える
0

これらのタグを使用してクラスとメソッドを構成しましたか? クラス実装前

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class xxx {...}

メソッド実装前

[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
public Contract getContract() {...}
于 2012-10-16T14:30:04.763 に答える
-1

'json'プロパティに文字列を含めるのではなく、オブジェクトを含める必要があります。このような:

public class Contract
{
    [DataMember]
    public int clientId;
    [DataMember]
    public JsonObj json;
}
public class JsonObj
{
    [DataMember]
    public string test;
}

そうすれば、jsonパーサーは必要なものを出力します。私は自分自身を明確にしたいと思います。

乾杯!

于 2012-10-16T15:51:45.693 に答える