首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.Net Core3.0.100-preview6-APIJSON的响应总是camelcase,但我的类不是

.Net Core3.0.100-preview6-APIJSON的响应总是camelcase,但我的类不是
EN

Stack Overflow用户
提问于 2019-07-24 12:13:10
回答 4查看 1.8K关注 0票数 3

我有一个.net核心3.0预览6 MVC应用程序和API。在API中,我使用的是第三方类库(不能更改),它将类属性定义为与JsonProperty、PropertyName蜗牛样的类大小写.

代码语言:javascript
复制
public class Company
{
[JsonProperty(PropertyName = "company_name")]
public string CompanyName { get; set; }

more properties ….
}

问题是,当我通过api提供这些信息时,它们会以Camel的形式到达MVC应用程序( .net核心3的默认设置).然后不能反序列化回类模型。

无论我尝试什么,API总是生产骆驼壳JSon,例如。上面的属性将被称为companyName。

我试过了

代码语言:javascript
复制
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属性。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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调用方法看起来像这样..。

代码语言:javascript
复制
        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的所有引用,并且它都能工作。

票数 0
EN

Stack Overflow用户

发布于 2019-10-09 07:11:24

代码语言:javascript
复制
Microsoft.AspNetCore.Mvc.NewtonsoftJson

不会出现默认情况。尝试将此nuget包手动安装到您的服务项目中。对我起作用了。

票数 3
EN

Stack Overflow用户

发布于 2019-07-24 13:05:44

尝试一下,并删除所有JsonProperty属性。

从现在开始,如果您不指定任何JsonPropertyy,它的作用将类似于CompanyName,比如company_name,或者ProPertyName1,比如pro_perty_name1。在这个例子中,将解释属性名称的概念。

并确保将此配置添加到ConfigureServices方法的底部,它可能会被另一项我不知道的内容覆盖。

代码语言:javascript
复制
services.AddMvc().AddJsonOptions(options =>
{
    options.SerializerSettings.ContractResolver = new DefaultContractResolver { NamingStrategy = new SnakeCaseNamingStrategy() };
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57182664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档