传递具有继承对象值的基础对象(Json)

斯拉奇兹

我使用以下代码调用了WebAPI:

var client = new HttpClient
{
    BaseAddress = new Uri("http://localhost:8490/")
};
var jObject = new JObject();
jObject.Add("paramA", paramA);
jObject.Add("paramB", paramB);
JArray jArr = JArray.FromObject(paramsGenericArr);
jObject.Add("paramC", jArr);
var content = new StringContent(jObject.ToString(), Encoding.UTF8, "application/json");
var result = await client.PostAsync("api/path/tofunc", content).ConfigureAwait(false);
result.EnsureSuccessStatusCode();

ParamsGeneric类是具有2个派生类的抽象类型:

[DataContract]
public class ParamsTypeA : ParamsGeneric
{
    [DataMember]
    public long itemC {get; set;}
    public ParamsTypeA() :
                      base()
    {}
}

[DataContract]
public class ParamsTypeB : ParamsGeneric
{
    [DataMember]
    public long itemD {get; set;}
    public ParamsTypeB() :
                      base()
    {}
}

[DataContract]
[KnownType(typeof(ParamsTypeA))]
[KnownType(typeof(ParamsTypeB))]
public abstract class ParamsGeneric
{
    [DataMember]
    public long itemA { get; set; }
    [DataMember]
    public long itemB {get; set;}
    public ParamsGeneric() 
    {}
}

我怀疑WebAPI中的反序列化有问题:

public class ClientData
{
    public string paramA { get; set; }
    public string paramB { get; set; }
    public ParamsGeneric[] paramC { get; set; }
}

[HttpPost]
[Route("api/path/tofunc")]
public async Task<bool> DoStuffAsync(ClientData clientData)
{
    ....
}

我对paramsGenericArr/ paramC(它是type ParamsGeneric[],并保存着ParamsTypeA类型的项ParamsTypeB)有问题

WebAPI会收到一个空白数组(ParamsGeneric[0])以及其他参数。

帮助将被申请。

更新

即使我尝试传递单个ParamsGeneric对象而不是数组,我也会接收null而不是对象。

解决方案

var serializer = new JsonSerializer();
serializer.TypeNameHandling = TypeNameHandling.Auto;
JArray jArr = JArray.FromObject(paramsGenericArr, serializer);

做到了。

交换

虽然消息/ json中的继承肯定是可能的,但是恕我直言;这太麻烦了:)

无论如何,您实际上可以通过设置TypeNameHandling来让Newtonsoft.Json为您处理继承

// Allow inheritance in json payload
JsonSerializerSettings serializerSettings = GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
serializerSettings.TypeNameHandling = TypeNameHandling.All;

.. 要不就

serializerSettings.TypeNameHandling = TypeNameHandling.Auto;

..根据您的需要。

这是简单的修复程序,如果它是内部API,或者可以保证始终由客户端控制,则可以很好地工作。如果您有外部客户端,则可以使用“覆盖默认模型绑定程序”的方法,例如此处发布的“将Json反序列化为Asp.Net Web API中的派生类型”,或者非常考虑避免在API模型中继承。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将具有派生模板的对象传递给接受具有基础模板的对象的函数

来自分类Dev

具有多个对象的Javascript原型继承

来自分类Dev

定义具有多级继承的对象

来自分类Dev

使用bless创建具有继承的对象

来自分类Dev

将json / data传递给具有光泽的javascript对象

来自分类Dev

如何从JSON对象数组中删除具有特定键/值对的所有JSON对象?

来自分类Dev

如何从具有值的JSON对象获取索引?

来自分类Dev

如何从JSON获取具有动态变量的对象值

来自分类Dev

RestAssured:从具有指定值的json对象获取键值

来自分类Dev

具有Json对象的CloneWithRows

来自分类Dev

创建具有不同基础类型的Nullable对象数组?

来自分类Dev

理解 JavaScript 代码 - 将值传递给已由具有值的函数定义的对象

来自分类Dev

循环遍历具有嵌套对象的JSON对象并检查布尔值c#

来自分类Dev

具有新对象的父类,以及子类中的新对象,对象/方法继承Python

来自分类Dev

JavaScript检查对象是否具有继承的属性

来自分类Dev

在实体框架中查找具有继承的对象

来自分类Dev

Js - 具有对象创建功能的原型继承

来自分类Dev

调用没有对象或传递值的函数

来自分类Dev

如何使具有默认值的对象不传递给类?

来自分类Dev

传递具有名称和值属性的对象数组作为查询参数

来自分类Dev

合并具有相同值的对象

来自分类Dev

具有默认值的Javascript对象

来自分类Dev

具有固定值的对象

来自分类Dev

具有最大值的对象列表

来自分类Dev

获取具有不同值的对象

来自分类Dev

具有多个值的JavaScript对象

来自分类Dev

如何计算具有元素值的对象?

来自分类Dev

对具有多个值的对象进行排序

来自分类Dev

合并具有相同值的对象

Related 相关文章

热门标签

归档