这有效:
var json = JsonConvert.SerializeObject(obj);
var content = new StringContent(json);
var httpResponse = await httpClient.PostAsync("", content);
// 200 OK
这不是:
var content = JsonContent.Create(obj);
var httpResponse = await httpClient.PostAsync("", content);
// 500 Internal Server Error
JsonContent 是否对内容进行不同的序列化或编码? 是否有序列化选项可能使第二个示例的行为与第一个示例类似?
我知道我可以使用第一个,但我试图理解为什么第二个不起作用。
更新: obj 是如何定义的?
var obj = new AccountLookupService.GetUserOnlineProfileRequest
{
ContractAccountNumber = "100087751101",
Address = new ServiceAddress
{
HouseNumber = string.Empty,
StreetName = string.Empty,
HouseNumberSupplement = string.Empty,
City = string.Empty,
State = string.Empty,
ZipCode = "48386",
},
Phone = string.Empty,
Name = string.Empty,
};
还有...
public class GetUserOnlineProfileRequest
{
public string? ContractAccountNumber { get; set; }
public ServiceAddress? Address { get; set; }
public string? Phone { get; set; }
public string? Name { get; set; }
public int AccountLimit { get; set; } = 10;
}
还有...
public class ServiceAddress
{
public string? HouseNumber { get; set; }
public string? StreetName { get; set; }
public string? HouseNumberSupplement { get; set; }
public string? City { get; set; }
public string? State { get; set; }
public string? ZipCode { get; set; }
}
我设置了以下测试来比较两个序列化器的默认序列化:
[Fact]
public async Task CompareSerializers()
{
var jsonContent = JsonContent.Create(obj);
var ms = await jsonContent.ReadAsStringAsync();
var json = JsonConvert.SerializeObject(obj);
var stringContent = new StringContent(json);
var ns = await stringContent.ReadAsStringAsync();
Assert.Equal(ms, ns);
}
这就是结果:
毫秒:
{"contractAccountNumber":"100087751101","ad···
{"ContractAccountNumber":"100087751101","Ad···
两者在各方面都是相同的,除了
System.Text.Json
序列化器对属性名称采用驼峰式命名,而 Newtonsoft.Json
则没有。