繁体   English   中英

使用继承的对象值传递基础对象(Json)

[英]passing base object with inherited object value (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 / paramCParamsGeneric[]类型的ParamsGeneric[] ,并保存ParamsTypeAParamsTypeB类型的项目)

WebAPI接收空数组( ParamsGeneric[0] )以及其他参数。

帮助将受到关注。

UPDATE

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

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

诀窍。

虽然在messages / 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模型中的继承。

尝试将数据传递到API,如下所示

Dictionary<string, string> param = new Dictionary<string, string>();
param.Add("paramA", paramA);
param.Add("paramB", paramB);

HttpClient client = new HttpClient();
HttpFormUrlEncodedContent contents = new HttpFormUrlEncodedContent(param);
var result = await client.PostAsync(new Uri("http://localhost:8490/api/path/tofunc")
                                                                         , contents);
var reply = await result.Content.ReadAsStringAsync();
if (reply.IsSuccessStatusCode)
{ 
}

希望这会帮助你。

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

请将[FromBody]保留在web api方法中,以便模型绑定器将您的正文数据映射到参数即clientData。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM