无法正确解析WCF Post请求json正文

时间:2017-02-19 14:18:55

标签: c# json wcf

我有一个帖子请求以下列格式发送到我的RESTful API

接头

Host: localhost:9475
Expect: 100-continue
Content-Type: application/json
Content-Length: 59

车身

{"query":"SOME STRING","variables":{"Foo":{"Data":"ABCD"}}}

我试图接收请求正文中的数据,所以这就是我尝试过的:

public void foo(string query, object variables)

正在正确解析查询参数,但变量参数始终以{object}作为其值。

public void foo(string query, Dictionary<string, object> variables)

正在正确解析查询参数,但变量参数是没有键/值的字典。

public void foo(string query, VariablesObj variables)

其中 VariablesObj

public class VariablesObj
{
   public object input_0 {get; set;}
}

查询参数正在被正确解析,变量参数有一个属性 input_0 ,其值为{object}。< / p>

我做错了吗?或者我错过了一些我需要实现的工作。

修改1:

我尝试了@rene的答案,它适用于这种情况,但我现在的问题是Foo内的对象并不总是与我在使用GraphQl和Relay上的对象相同客户端,它将变量更改为需要发送的任何对象,但它通常只是内部的一个对象。

1 个答案:

答案 0 :(得分:2)

要获得正确的映射,请确保您的类具有公共属性Foo,该类具有类型为string的公共属性Data。

如果这是您的公共界面

public void foo(string query, MyVars variables)

您需要以下课程:

public class MyVars 
{
     public DataVars Foo { get; set; }
}

public class DataVars 
{
    public string Data { get; set;}
}

您可以使用DataContractJsonSerializer

快速测试
var json = @"{""query"":""SOME STRING"",""variables"":{""Foo"":{""Data"":""ABCD""}}}";

var ser = new DataContractJsonSerializer(typeof(wrapper));
var sr = new MemoryStream(Encoding.UTF8.GetBytes(json));
var mv = (wrapper) ser.ReadObject(sr);
mv.Dump();

我添加了一个额外的包装类型作为方法签名的替身:

   public class wrapper
   {
       public string query {get; set;}
       public MyVars variables { get;set;}
   }

在LinqPad中运行时,结果将是:

linqpad result

这证明我们的类层次结构对于完全反序列化给定的Json是正确的。

当你的变量可以是各种数据形状时,你必须定义尽可能多的类来覆盖它们并在需要知识类型列表的专用构造函数上提供它们:DataContractJsonSerializer Constructor (Type, IEnumerable<Type>)。设计这些类的过程不会改变,你只会有一堆。将KnownType属性添加到您的datacontract类。