我有一个.net核心3.0预览6 MVC应用程序和API。在API中,我使用的是第三方类库(不能更改),它将类属性定义为与JsonProperty、PropertyName蜗牛样的类大小写.
public class Company
{
[JsonProperty(PropertyName = "company_name")]
public string CompanyName { get; set; }
more properties ….
}问题是,当我通过api提供这些信息时,它们会以Camel的形式到达MVC应用程序( .net核心3的默认设置).然后不能反序列化回类模型。
无论我尝试什么,API总是生产骆驼壳JSon,例如。上面的属性将被称为companyName。
我试过了
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver { NamingStrategy = new CamelCaseNamingStrategy { OverrideSpecifiedNames = true } };
options.SerializerSettings.ContractResolver = new DefaultContractResolver { NamingStrategy = new DefaultNamingStrategy { OverrideSpecifiedNames = true } };我在camel和默认的NamingStrategy上都尝试了ContractResolver = null。还尝试将NamingStrategy设置为Snake
但是没有什么改变输出的Json,它总是以骆驼为基础。
在MVC应用程序中,我可以看到结果字符串是用ReadAsStringAsync实现的.当我使用JsonConvert.DeserializeObject时,属性总是为null,因为名称或Json PropertyName都不匹配结果字符串中的名称。
这是.net核心预览中的一个bug,还是缺少了其他东西?
谢谢穆斯塔法,您建议的复制与我已经尝试过的解决方案是一样的,也就是将ContractResolver / NamingStrategy的设置更改为不同的值.然而,我的问题是,所建议的解决方案似乎没有对API响应产生任何影响--它总是以camelCased的形式返回。
有趣的是,当我将NamingStrategy改为Snake时,Swagger将模式显示为set (即蛇),但实际输出仍然是camelCased!
此外,我无法控制基类,因此无法更改我试图传输的类的名称/ json属性。
发布于 2019-07-26 12:01:13
不太清楚问题出在哪里,但我觉得这与Newtonsoft.Json、Json.Net、Swagger的结合以及我使用Microsoft.AspNet.WebApi.Client获取HttpContent.ReadAsAsync…的事实有关。.all有不同的Json's
因此,我决定重新开始一个真正简单的应用程序和api,使用新的System.Text.Json,包括在.Net核心预览(没有其他库)。也不使用HttpContent.ReadAsAsync,而是以字符串的形式读取响应,然后使用新库(System.Text.Json)反序列化。
这样做,我有完全相同的问题,…。属性名或Json PropertyName都不匹配api返回的字符串中的名称,即类属性名称= "companyName“和Json PropertyName = "company_name”,而api提供的json = "CompanyName“。因此,在反序列化时不设置值。
但是,在新的System.Text.Json选项中,我可以指定PropertyNameCaseInsensitive = true,这解决了我的问题,现在companyName确实等于CompanyName,并且在反序列化时正确地设置了类模型值。
所以我的api调用方法看起来像这样..。
using HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, string.Format("Companies?aCompanyName={0}", aCompanyName));
using HttpResponseMessage response = await Client.SendAsync(request);
string content = await response.Content.ReadAsStringAsync();
if (response.IsSuccessStatusCode == false)
{
throw new ApiException
{
StatusCode = (int)response.StatusCode,
Content = content
};
}
_JsonOptions = new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
};
return JsonSerializer.Deserialize<IEnumerable<Company>> (content, _JsonOptions);我确实尝试过在启动类中全局设置JsonSerializerOptions,但这是行不通的。
我已经将这种方法转移到我的应用程序中的所有http调用,删除了对Newtonsoft的所有引用,并且它都能工作。
发布于 2019-10-09 07:11:24
Microsoft.AspNetCore.Mvc.NewtonsoftJson不会出现默认情况。尝试将此nuget包手动安装到您的服务项目中。对我起作用了。
发布于 2019-07-24 13:05:44
尝试一下,并删除所有JsonProperty属性。
从现在开始,如果您不指定任何JsonPropertyy,它的作用将类似于CompanyName,比如company_name,或者ProPertyName1,比如pro_perty_name1。在这个例子中,将解释属性名称的概念。
并确保将此配置添加到ConfigureServices方法的底部,它可能会被另一项我不知道的内容覆盖。
services.AddMvc().AddJsonOptions(options =>
{
options.SerializerSettings.ContractResolver = new DefaultContractResolver { NamingStrategy = new SnakeCaseNamingStrategy() };
});https://stackoverflow.com/questions/57182664
复制相似问题