将一个复杂的对象从SERVER1发送到SERVER2

时间:2017-08-17 14:03:14

标签: c# json

我正在尝试这样发送不是单个对象,而是从SERVER1到SERVER2的复杂对象。

服务器1:

/// <summary>
/// SERVER 1
/// </summary>
internal void SomeActionMethod(Guid sid, CustomClass2 offer, List<CustomClass1> calculation)
{
    //The reason for wrapping this, is that "PostAsJsonAsync" will only except 1 dto, but I need both.
    List<Object> dto = new List<object>();
    dto.Add(offer);
    dto.Add(calculation);

    var resp = _client.PostAsJsonAsync(_baseadress + @"someController/SomeActionMethod?sid=" + sid.ToString(), dto).Result;

    if (!resp.IsSuccessStatusCode)
        throw new Exception(...);
}

服务器2:

/// <summary>
    /// SERVER 2 
    /// </summary>
    public void SomeActionMethod(Guid sid, [FromBody]List<object> dto)
    {
        //unwrapp
        CustomClass2 offer=new CustomClass2();
        List<CustomClass1> calculation=new List<CustomClass1>();

        foreach (var server1_item in dto)
        {
            if (server1_item is CustomClass2)
                offer = (CustomClass2)server1_item;
            else if (server1_item is List<CustomClass1>)
                calculation = (List<CustomClass1>)server1_item;
            else
                continue;
        }

        //Do some stuff
    }

我得到了一些JSON,但我不能检查(server1_item is CustomClass2)

在这做什么,我该如何解决这个问题?!

感谢。

1 个答案:

答案 0 :(得分:0)

通过将其序列化并反序列化为object类型,您实质上会丢弃所有信息,这些信息会告诉后面的代码(在服务器2上)有关数据最初类型的任何信息。

与JSON进行序列化/反序列化与强制转换不同。它是将包含一系列属性的对象从代码对象转换为字符串,然后再转换回来的过程。它完全依赖于匹配指定类型的属性名称。在这种情况下,object没有属性,因此没有任何匹配。在反序列化时,您可以有效地丢弃JSON中的所有内容,因为JSON中的属性不匹配给定类型中的任何内容。

我认为你可能需要在server2上有两个动作方法,一个用于[FromBody]List<CustomClass1> dto,另一个用于CustomClass2。您的客户必须决定在不同情况下发送哪一个。

另一方面,如果您尝试发送包含两种类型对象混合的列表,那么您可以尝试反序列化到包含所有可能字段的接口定义,或者您可以尝试使用{ {1}}也许吧。然后,如果您之后需要转换为两个具体类之一,则可能必须对填充的属性进行一些手动检查以确定它的类型。这可能会在您尝试做的事情中指出更广泛的设计问题,但这并不是在这里处理范围的事情。