StringContent(json) 与 JsonContent.Create(obj)

问题描述 投票:0回答:1

这有效:

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; }
}
c# .net-core dotnet-httpclient
1个回答
0
投票

我设置了以下测试来比较两个序列化器的默认序列化:

[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···

ns:
{"ContractAccountNumber":"100087751101","Ad···

两者在各方面都是相同的,除了

System.Text.Json
序列化器对属性名称采用驼峰式命名,而
Newtonsoft.Json
则没有。

© www.soinside.com 2019 - 2024. All rights reserved.