我遇到了在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字符串后手动连接它,但这会耗费大量时间。有没有解决这个问题的解析器。
答案 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很简单 - 保持简单。