C# 使用继承的对象值(Json)传递基本对象

C# 使用继承的对象值(Json)传递基本对象,c#,serialization,asp.net-web-api,json.net,C#,Serialization,Asp.net Web Api,Json.net,我使用以下代码调用了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); jObje

我使用以下代码调用了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类是一个抽象类型,有两个派生类:

[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)
{
    ....
}
成功了。

[HttpPost]
[HttpPost]
[Route("api/path/tofunc")]
public async Task<bool> DoStuffAsync([FromBody]ClientData clientData)
{
....
}
[路由(“api/path/tofunc”)] 公共异步任务DoStuffAsync([FromBody]ClientData-ClientData) { .... }

请将[FromBody]保留在web api方法中,以便model binder将您的body数据映射到参数,即clientData。

尝试将数据传递到您的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)
{ 
}
Dictionary param=newdictionary();
参数添加(“paramA”,paramA);
参数添加(“参数B”,参数B);
HttpClient=新的HttpClient();
HttpFormUrlEncodedContent内容=新的HttpFormUrlEncodedContent(参数);
var result=wait client.PostAsync(新Uri(“http://localhost:8490/api/path/tofunc")
,目录);
var reply=wait result.Content.ReadAsStringAsync();
if(回复。IsSuccessStatusCode)
{ 
}

希望这会对您有所帮助。

虽然在messages/json中继承是绝对可能的,但IMHO;这实在是太麻烦了:)

无论如何,您实际上可以通过设置

。。或者只是

serializerSettings.TypeNameHandling = TypeNameHandling.Auto;
。。根据你的需要


这是一个简单的解决方案,如果它是一个内部API,或者如果您可以保证您将始终控制客户端,那么它将很好地工作。如果你有外部客户端,我会去“重写默认模型绑定器”的方法——比如这里张贴的“”——或者非常强烈地考虑在API模型中避免继承。正如我所写的,我确实得到了clientData的一个值。clientData中只有paramC是ParamsGeneric[0](如果我将其更改为单个对象而不是数组,则为null)。为什么需要编写抽象类(公共抽象类ParamsGeneric)?你能把它变成具体的类并尝试一下吗?因为我想传递两种类型的值(ParamsTypeA/ParamsTypeB)。这是继承的优点之一。对于这类事情,您必须重写默认的模型绑定器,并且这个链接将帮助您,请注意,您知道您可以将匿名对象与Json.Net一起使用来创建Json吗
JsonConvert.SerializeObject(新的{paramA,paramB,paramC=new[]{…}})
@LasseV.Karlsen很好知道。检查自定义的JSON转换器以处理继承的类。文章还解释了为什么不建议使用
typenameholling.Auto或All
// Allow inheritance in json payload
JsonSerializerSettings serializerSettings = GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
serializerSettings.TypeNameHandling = TypeNameHandling.All;
serializerSettings.TypeNameHandling = TypeNameHandling.Auto;