序列化JSON字符串以匹配WCF服务功能参数

时间:2011-12-12 14:37:21

标签: c# wcf json rest

我遇到了在JSON中序列化对象以匹配WCF函数调用的参数名称的问题。问题是映射参数名称,即传入的JSON字符串应该具有与函数中传递的参数相同的起始值,例如。

"{\"GetComplexDataResult\":{\"BoolValue\":true,\"StringValue\":\"Hello World!\"}}"

这是我在我的客户端调用的WCF函数,您可以看到参数名称与返回的参数名称相同“GetComplexDataResult”

[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
String SaveData(CompositeType GetComplexDataResult);

出现的问题是当我尝试使用Microsoft System.Web.Script.Serialization.JavaScriptSerializer或任何其他库(例如Json.NET)序列化我的对象时

即使我传递了同一类“CompositeType”的对象(这是客户端代码),它也只返回{\"BoolValue\":true,\"StringValue\":\"Hello World!\"},例如

CompositeType GetComplexDataResult= new CompositeType();
GetComplexDataResult.BoolValue = true;
GetComplexDataResult.StringValue = "Hello World";

JavaScriptSerializer serializer = new JavaScriptSerializer();
string json = serializer.Serialize(patchVersion);

我的问题是如何获取此JSON字符串

"{\"GetComplexDataResult\":{\"BoolValue\":true,\"StringValue\":\"Hello World!\"}}"

而不是

{\"BoolValue\":true,\"StringValue\":\"Hello World!\"}

将我的对象传递给JSON解析器。我可以在生成JSON字符串后手动连接它,但这会耗费大量时间。有没有解决这个问题的解析器。

3 个答案:

答案 0 :(得分:3)

如果使用参数名称作为属性名序序列化匿名对象,它将把它包含在json字符串中。试试这个:

string json = serializer.Serialize(new { GetComplexDataResult = patchVersion});

此外,如果您根本不关心参数名称是否包含在JSON中,您可以将BodyStyle设置为BodyStyle = WebMessageBodyStyle.Bare

答案 1 :(得分:2)

我的问题是,您是否需要在json数据的开头设置\"GetComplexDataResult\"

我不相信json序列化程序会在本机上执行您想要的操作,您几乎必须自己处理它。

我们在我工作的公司所做的是,我们构建自己的响应包装器,使我们所有的响应与所有json服务的格式相同。因此,我们制作了一个标准的数据提取,它为outter包装器的一个属性返回一个datacontract。你可以做类似的事情来获得你正在寻找的“嵌套”功能。

以下是一个例子:

[DataContract]
    public class ServiceResult<T>
    {
        [DataMember]
        public T GetComplexDataResult{ get; set; }
    }

更新:将此修改为通用。我想用我原来的答案进一步解释我的目标。再一次,adrift的答案更简洁,请记住,如果你想扩展,比如添加消息,你必须做这样的事情,或者自己动手做。我非常喜欢这种方法,因为无论我调用哪种WCF服务,我都知道我的格式总是一样的。

答案 2 :(得分:1)

对于我见过的每个JSON解析器 - 对象类型永远不会包含在JSON中。序列化表示该对象的实例。如果您需要知道对象源类型引用,最好添加type属性。 {\"BoolValue\":true,\"StringValue\":\"Hello World!\",\"type\":\"GetComplexDataResult\"}

你的输出让我想起了一个SOAP信封。您不需要封装 - 它只是使它更复杂。 JSON很简单 - 保持简单。