如何使用json动态成员获得WCF DataContract

Jea*_*ois 8 c# wcf serialization json

在我正在开发的项目中,我们需要一个可以包含一些未定义的JSON的DataContract.

DataMember是一些仅对客户端有意义的JSON.我们希望允许客户向我们发送我们不知道的json.

例:

public class Contract
{
    [DataMember]
    public int clientId;
    [DataMember]
    public string json;
}
Run Code Online (Sandbox Code Playgroud)

显然,有一个像这样定义的契约需要客户端像这样转义json:

{
    "clientId":1,
    "json": "{\"test\":\"json\"}"
}
Run Code Online (Sandbox Code Playgroud)

显然,这不是我们所需要的.客户端应该发送给我们的json应该如下所示:

{
    "clientId":1,
    "json": {"test":"json"}
}
Run Code Online (Sandbox Code Playgroud)

可能的解决方案:

  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);
Run Code Online (Sandbox Code Playgroud)

此外,该服务使用以下属性进行装饰:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
Run Code Online (Sandbox Code Playgroud)

谢谢.JF

car*_*ira 4

WCF(从 4.5 开始)不支持将任意 JSON 反序列化为数据协定的一部分。您需要使用另一个序列化器来执行此操作 - JSON.NET 是我个人喜欢的序列化器。为了能够更改序列化程序,您可以使用不同的消息格式化程序,并在https://github.com/microsoftarchive/msdn-code-gallery-community-sz/tree/master/Supporting%20 Different%20data 的帖子中%20and%20serialization%20formats%20in%20WCF我有一个示例,它正是这样做的 - 用 JSON.NET 替换 WCF 使用的默认序列化。

请注意,要使用该库接收任意 JSON,您需要将“json”属性的类型更改为 JSON.NET JToken 中任意 JSON 的等效项:

public class Contract 
{ 
    [DataMember] 
    public int clientId; 
    [DataMember] 
    public Newtonsoft.Json.Linq.JToken json; 
} 
Run Code Online (Sandbox Code Playgroud)