Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 序列化JSON字符串以匹配WCF服务函数参数_C#_Wcf_Json_Rest - Fatal编程技术网

C# 序列化JSON字符串以匹配WCF服务函数参数

C# 序列化JSON字符串以匹配WCF服务函数参数,c#,wcf,json,rest,C#,Wcf,Json,Rest,我在JSON中序列化对象以匹配WCF函数调用的参数名时遇到问题。问题是映射参数名,即传入的JSON字符串的起始值应与函数中传递的参数的名称相同,例如 "{\"GetComplexDataResult\":{\"BoolValue\":true,\"StringValue\":\"Hello World!\"}}" 这是我在客户机中调用的WCF函数,您可以看到参数名与返回的“GetComplexDataResult”相同 出现的问题是,当我尝试使用MicrosoftSystem.Web.Scri

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

"{\"GetComplexDataResult\":{\"BoolValue\":true,\"StringValue\":\"Hello World!\"}}"
这是我在客户机中调用的WCF函数,您可以看到参数名与返回的“GetComplexDataResult”相同

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

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

我的问题是如何获得这个JSON字符串

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

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

只需将我的对象传递给JSON解析器。我可以在生成JSON字符串后手动连接它,但这将是一项非常耗时的工作。是否有任何解析器可以解决这个问题。

对于我见过的每个JSON解析器,JSON中从来没有包含对象类型。序列化表示该对象的一个实例。如果需要了解对象源类型引用,最好添加
type
属性<代码>{\'BoolValue\':true,\'StringValue\':\'Hello World!\',\'type\':\'GetComplexDataResult\'}


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

我的问题是,在JSON数据的开头需要有
\“GetComplexDataResult\”
的重要原因吗

我不相信json序列化程序会按照您希望它们在本机上执行的操作,您几乎必须自己处理它

我们在我工作的公司所做的是,我们构建自己的响应包装器,使所有json服务的所有响应都具有相同的格式。所以我们制作了一个标准的datacontract,它为outter包装器的一个属性返回一个datacontract。您可以这样做,以获得您正在寻找的“嵌套”功能

以下是一个例子:

[DataContract]
    public class ServiceResult<T>
    {
        [DataMember]
        public T GetComplexDataResult{ get; set; }
    }
[DataContract]
公共类服务结果
{
[数据成员]
公共T GetComplexDataResult{get;set;}
}

更新:将其修改为通用。我想用我最初的答案进一步解释我要去哪里。同样,adrift的答案更简洁,只要记住,如果您想要扩展,比如添加消息,您必须执行类似的操作,或者自己手动执行。我非常喜欢这种方法,因为我知道无论调用哪个WCF服务,我的格式都是相同的。

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

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

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

这里的问题不是类型,而是在生成的JSON开头添加对象名“GetComplexDataResult”。WCF映射JSON字符串中的名称和传递给函数的参数。WCF json响应是这样的,“{\”GetComplexDataResult\”:{\“BoolValue\”:true,““StringValue\”:“Hello World!\”}}}”,当我使用GET调用函数时,它会自动将函数名“GetComplexData”和额外的“Result”属性附加到该函数。因此,我认为有一种方法可以做到这一点,因为WCF正在这样做,这一定是可能的。是的,因为WCF将JSON字符串中的名称映射到传递给函数的参数,例如string SaveData(CompositeType GetComplexDataResult)有一个名为“GetComplexDataResult”的参数,并且要将值映射到此对象,JSON字符串应该是“{\”GetComplexDataResult\“:{\“BoolValue\”:true,\“StringValue\”:\“Hello World!\“}}”。我需要看看在我的对象周围创建一个包装器对我有多大帮助。正如我所指出的,我做了与您想要的完全相同的事情,但是我们将它包装在一个通用的outter ServiceResult契约中,其中内部属性是public T[]Data{get;set;}。因此,返回的数据总是在json返回的“数据”中。漂流的答案本质上做了完全相同的事情,你得到了相同的结果。
[DataContract]
    public class ServiceResult<T>
    {
        [DataMember]
        public T GetComplexDataResult{ get; set; }
    }
string json = serializer.Serialize(new { GetComplexDataResult = patchVersion});