【问题标题】:Can't parse WCF Post request json body correctly无法正确解析 WCF Post 请求 json 正文
【发布时间】:2017-02-19 14:18:54
【问题描述】:

我有一个 post 请求以下列格式发送到我的 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)

query 参数被正确解析,但 variables 参数始终将{object} 作为其值。

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

query 参数被正确解析,但 variables 参数是一个没有键/值的字典。

public void foo(string query, VariablesObj variables)

其中 VariablesObj

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

query 参数被正确解析,variables 参数有一个属性 input_0,其值为{object}

我做错了吗?还是我错过了一些我需要实现的东西才能工作。

编辑 1:

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

【问题讨论】:

    标签: c# json wcf


    【解决方案1】:

    要获得正确的映射,请确保您有一个具有公共属性 Foo 的类,该类的类型具有字符串类型的公共属性 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 中运行时,结果如下:

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

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

    【讨论】:

    • 非常感谢您的回答,我尝试了您的建议并且效果很好,但我面临另一个问题,即 Foo 中的对象与每个请求都不相同。我正在使用 GraphQl,它根据从客户端发送的请求,在变量中发送具有不同数据的相同主体。
    • @SamNasser 您需要为每个场景设置一个类或一个涵盖所有可能属性的类。我添加了一个指向构造函数的链接,它可以做到这一点。
    • 非常感谢,我会试一试。此外,我会将问题标记为答案,因为它回答了我的第一个问题。
    猜你喜欢
    • 2014-06-10
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多