【发布时间】:2026-02-14 22:25:04
【问题描述】:
我使用以下代码调用了一个 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)
{
....
}
我对@987654325@/paramC(类型为ParamsGeneric[],并保存ParamsTypeA 和ParamsTypeB 类型的项目)有疑问
WebAPI 接收一个空白数组 (ParamsGeneric[0]) 以及其他参数。
将获得帮助。
更新
即使我尝试传递单个 ParamsGeneric 对象而不是数组,我也会收到 null 而不是对象。
解决方案
var serializer = new JsonSerializer();
serializer.TypeNameHandling = TypeNameHandling.Auto;
JArray jArr = JArray.FromObject(paramsGenericArr, serializer);
成功了。
【问题讨论】:
-
旁注,你知道你可以在 Json.Net 中使用匿名对象来创建 json 吗?
JsonConvert.SerializeObject(new { paramA, paramB, paramC = new[] { ... } }) -
@LasseV.Karlsen 很高兴知道。
-
查看this post 以获取用于处理继承类的自定义 JSON 转换器。该帖子还解释了为什么不建议使用
TypeNameHandling.Auto or All。
标签: c# serialization asp.net-web-api json.net