相关疑难解决方法(0)

.Net Core 3.0中IMvcBuilder AddJsonOptions放在哪里?

我刚刚将我的ASP Web API项目从.Net core 2.0升级到3.0。我在用

     services.AddMvc()
             .AddJsonOptions(options =>options.SerializerSettings.ContractResolver 
                                       = new DefaultContractResolver());
Run Code Online (Sandbox Code Playgroud)

以前是为了确保序列化JSON的小写字母。

升级到3.0后,出现此错误...

错误CS1061'IMvcBuilder'不包含'AddJsonOptions'的定义,找不到可以接受的扩展方法'AddJsonOptions'接受类型为'IMvcBuilder'的第一个参数(是否缺少using指令或程序集引用?)

根据Asp.Net Core 2.2中MvcJsonOptions的AddJsonOptions,Microsoft.AspNetCore.Mvc.Formatters.Json nuget包提供了AddJsonOptions扩展方法。我尝试安装/重新安装此程序,但仍然无法解决该方法。有趣的是,智能感知仅显示Microsoft.AspNetCore.Mvc.Formatters。即使我添加了Json nuget包,当我尝试添加using语句时也使用Xml

有什么想法吗?该文档AddJsonOptions只上升到.NET 2.2所以也许是方法已经在3.0赞成一些其他配置机制的被弃用?

asp.net json.net asp.net-core asp.net-core-3.0

35
推荐指数
5
解决办法
1万
查看次数

将对象绑定到Web API端点时指定自定义属性名称

我有一个.Net Core Web API.当模型属性与请求主体匹配时,它会自动映射模型.例如,如果您有这个类:

public class Package
{
    public string Carrier { get; set; }
    public string TrackingNumber { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如果请求主体是以下JSON,它会正确地将它绑定到POST端点:

{
    carrier: "fedex",
    trackingNumber: "123123123"
}
Run Code Online (Sandbox Code Playgroud)

我需要做的是指定要映射的自定义属性.例如,使用上面的同一个类,如果TrackingNumber进来,我需要能够映射到JSON tracking_number.

我怎么做?

c# asp.net-web-api asp.net-core

15
推荐指数
4
解决办法
1万
查看次数

WebApi - 反序列化和序列化备用属性名称

我试图找出如何使用ASP.NET WebApi指定备用属性名称 - 并使其适用于反序列化+序列化以及JSON + XML.到目前为止,我只发现了部分解决方案.

我希望将属性名称公开为带有下划线的小写,并且(例如)为了具有不同的内部名称:

外部:

  • 现场一个
  • 现场二

内部:

  • ItemOne
  • ItemTwo

对于测试,这是一个POST控制器动作,只是传递它接收的内容:

// POST api/values
public TestSerialization Post([FromBody]TestSerialization value)
{
    return value;
}
Run Code Online (Sandbox Code Playgroud)

还有一个测试实体:

public class TestSerialization
{
    [DataMember(Name = "field_one")] // Doesn't appear to change anything
    public string ItemOne { get; set; }

    [JsonProperty(PropertyName = "field_two")] // Only works for serialization in JSON mode
    public string ItemTwo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我发现:

  • [DataMember(Name ="x")]对任一方向的序列化没有影响
  • [JsonProperty(Name ="x")]在使用JSON时处理序列化(返回值).(这是一个JSON.NET属性,默认的序列化程序).

对于测试数据,我提交了4个属性,以查看反序列化的值,以及反序列化时的属性名称

  • ItemOne ="价值A"
  • ItemTwo ="价值B"
  • field-one ="正确1"
  • field-two ="正确2"

我怎样才能做到这一点?

c# asp.net asp.net-web-api

11
推荐指数
2
解决办法
1万
查看次数

dotnet core 3.0 不支持 DataMember 属性

我创建了一个示例 dotnet core 3.0 Web API 项目并进行了以下更改,

  1. 创建模型类 TestData
using System.Runtime.Serialization;
namespace WebApplication17.Models
{
    [DataContract]
    public class TestData
    {
        [DataMember(Name = "testaction")]
        public string Action { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我在控制器中进行了更改WeatherForecastController,以添加一个 post 端点

[HttpPost("package/{packageName}/version/{version}")]
public void Post(string packageName, string version, [FromBody] TestData activityPayload)
{
    Console.WriteLine(activityPayload.Action);
}
Run Code Online (Sandbox Code Playgroud)

现在我从邮递员那里打来电话或用身体卷曲

{   
    "testaction": "action"  
}
Run Code Online (Sandbox Code Playgroud)

仍然在 的Post方法中WeatherForecastControlleractivityPayload.Actionnull

我期待它是“行动”

c# .net-core asp.net-core-webapi asp.net-core-3.0 .net-core-3.0

9
推荐指数
3
解决办法
5656
查看次数

我在web api 2中使用DataContractJsonSerializer或Json.net

在提出这个问题之后,我试图在web api 2中获取所有这些序列化内容,我读了这篇 http://www.asp.net/web-api/overview/formats-and-model-binding/json -and-XML序列化

但现在我很困惑

1在我的webapiconfig中,我没有这一行

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.UseDataContractJsonSerializer = true;
Run Code Online (Sandbox Code Playgroud)

所以我认为我正在使用默认的Json.net序列化程序.无论如何,我仍然可以在类中使用DataContract,因此只有用DataMember属性修饰的属性才会被序列化.这两个假设是否正确?

2如果我没有使用DataContract修饰类,则所有属性都将被序列化.这发生在Json.net和DataContractJsonSerializer上

3如果我改变(如我链接的问题),序列化程序仍然使用它的解析器,是因为它是Json.net一个或一个与另一个无关的东西?因为如果我在全球使用它

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.UseDataContractJsonSerializer = true;
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
Run Code Online (Sandbox Code Playgroud)

即使它没有提出任何问题,它似乎也没有提起(也没有使用自定义合约解决方案)

3如果我有一个派生自另一个的类,并且我使用DataContract装饰父类,在我看来,我必须使用DataMember来装饰子类的属性以进行序列化.或者我做错了什么?

谢谢

c# serialization asp.net-web-api

5
推荐指数
1
解决办法
3505
查看次数