相关疑难解决方法(0)

在我的 POST 请求操作中,JsonProperty 映射不起作用

我有一个如下所示的模型和控制器

public class OrderModel
{
    [JsonProperty("order_id")]        
    public string ID { get; set; }

    [JsonProperty("delivery_shift")]
    public string DeliveryShift { get; set; }
    public string InvoiceType { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
[Route("api/[controller]")]
[ApiController]
public class OrderController : ControllerBase
{
    [HttpPost]
    public IActionResult Index([FromBody] OrderModel order) {

        return new JsonResult(new
        {
            order.ID,
            order.DeliveryShift,
            order.InvoiceType
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我在正文中提交带有此 json 的 post 请求order_id并且delivery_shift不与模型映射时。

{"order_id": "OrderID", "delivery_shift": "evening", "InvoiceType": "DUE"}
Run Code Online (Sandbox Code Playgroud)

但是当我以这种格式提交 json 时它可以工作,但我需要以前的格式才能工作

{"ID": "OrderID", "DeliveryShift": "evening", "InvoiceType": "DUE"} …
Run Code Online (Sandbox Code Playgroud)

c# asp.net json asp.net-core-3.1

6
推荐指数
0
解决办法
3080
查看次数

避免或控制 Entity Framework Core 中的循环引用

我真的受够了,但至少我想知道发生了什么事。开始了:

我的项目是一个 ASP.NET Core Web 应用程序,具有 Code First Entity Framework Core 和 Angular 前端。

我想控制何时加载引用的对象。它们可能很有用,但它们也可能在前端创建带有内部错误的循环引用。(JSON 将无限长。)

楷模:

class Book {
   public virtual ICollection<Page> Pages { get; set; }
   ...simple properties
}

class Page {
   public virtual Book Book { get; set; }
   ...simple properties
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,书籍中的每本书都会有一个空/空页面列表。

using (var context = new MoneyStatsContext())
{
   var books = context.Books.Where(rule => rule.State == 1).ToList();
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,Pages列表不为 null,并且每个Page都会设置其Book属性。从而创建循环引用。

using (var context = new MoneyStatsContext()) …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc entity-framework-core asp.net-core

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

如何使用 System.Text.Json 将 Newtonsoft JToken 序列化为 JSON?

在升级到 ASP.NET Core 5 的过程中,我们遇到了一种情况,需要JObject使用System.Text.Json. 如何以相当有效的方式完成此操作,而不需要将 JSON 重新序列化和重新解析为 aJsonDocument或通过 完全恢复回 Json.NET AddNewtonsoftJson()

具体来说,假设我们有以下遗留数据模型:

public class Model
{
    public JObject Data { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我们从 ASP.NET Core 5.0 返回此值时,“value”属性的内容被破坏成一系列空数组。例如:

var inputJson = @"{""value"":[[null,true,false,1010101,1010101.10101,""hello"","""",""\uD867\uDE3D"",""2009-02-15T00:00:00Z"",""\uD867\uDE3D\u0022\\/\b\f\n\r\t\u0121""]]}";
var model = new Model { Data = JObject.Parse(inputJson) };
var outputJson = JsonSerializer.Serialize(model);

Console.WriteLine(outputJson);

Assert.IsTrue(JToken.DeepEquals(JToken.Parse(inputJson), JToken.Parse(outputJson)[nameof(Model.Data)]));
Run Code Online (Sandbox Code Playgroud)

失败,并生成以下错误的 JSON:

public class Model
{
    public JObject Data { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如何正确序列化JObject属性System.Text.Json?请注意, 可能JObject相当大,因此我们更愿意将其流式传输,而不是将其格式化为字符串并从头开始再次将其解析为 …

c# json json.net system.text.json asp.net-core-5.0

6
推荐指数
1
解决办法
5576
查看次数

.NET Core 3.0 WebApi (JsonSerialize) 不序列化嵌套对象/所有对象信息

我有一个对象列表 as IEnumerable<IHit<Header>>,但 .NET Core 3.0 没有发出所有信息

这是当我返回列表的单个对象 IHit 时 obj.ElementAt(0)

{"explanation":null,"fields":null,"highlight":{},"id":"123","index":"ky","innerHits":{},"matchedQueries":[], "nested":null, "primaryTerm":null, "routing":null, "score":10.98915, "sequenceNumber":null, "sorts":[],"source":{"timeStamp":"2019-05 -16T06:16:07Z", "result":"PASS","testTimeStart":"20190516141559","testTimeEnd":"20190516141607","barcode":"XXRX8762"},"type":"_doc","版本":0}

但是当我返回列表本身时:

[{"explanation":null,"fields":null,"highlight":{},"innerHits":{},"matchedQueries":[],"nested":null,"score":10.98915,"sorts" :[]}]

也当我尝试明确调用 JsonSerializer

string s = JsonSerializer.Serialize(result, typeof(IEnumerable<IHit<Header>>), obj);
Run Code Online (Sandbox Code Playgroud)

总结:

  1. 的WebAPI工作正常,返回如果正确序列化对象劲儿对象:

    public IHit<Header> Get(string id)

但是当一个列表时,则不是。

public IEnumerable<IHit<Header>> GetAll()
Run Code Online (Sandbox Code Playgroud)

我试过了IEnumerable, IList, List,结果都是一样的!

  1. JsonSerializer既不处理单个对象也不处理列表

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

5
推荐指数
2
解决办法
4061
查看次数

升级到 .Net 6 后,Json 反序列化无法在使用 Newtonsoft.Json 的 F# 中工作

这些是我的类型:

[<DataContract>]
type AreaCodeSingleResponse = 
    { [<field:DataMember(Name = "id")>]
      Id : string
      [<field:DataMember(Name = "code")>]
      Code : string
      [<field:DataMember(Name = "name")>]
      Name : string }

[<DataContract>]
type AreaCodeListResponse = 
    { 
    [<field:DataMember(Name = "areacode_list")>]
      AreaCodeList : List<AreaCodeSingleResponse> }
Run Code Online (Sandbox Code Playgroud)

这是数据示例:

{
    "areacode_list": [
        {
            "id": "00447",
            "code": "07",
            "name": "UK Mobile",
            "order_column": "_00447"
        },
        {
            "id": "0044113",
            "code": "0113",
            "name": "Leeds",
            "order_column": "0044113"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

这是反序列化代码,这里调用的是传入类型AreaCodeListResponse:

member __.ReturnDataToType<'T>() =
    __.ReturnData
    |> JsonConvert.DeserializeObject<'T>
Run Code Online (Sandbox Code Playgroud)

在我升级到 DotNet6 之前,这工作正常并返回数据列表。之后,它失败并返回一个空列表。没有抛出任何错误,但列表为空。

对于我使用类和其他类型进行反序列化的所有其他调用来说,这都是失败的。

有什么变化需要我注意吗?我不是 F# 专家,只是在处理一些遗留代码时才开始使用它。

f# json json.net .net-core .net-6.0

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

带有 FileInfo 的 ASP.NET Core 序列化对象返回不完整的 JSON

我有一个带有控制器的 ASP.NET Core 2.2 项目,其 GET 方法返回一个包含System.IO.FileInfo属性的对象。当我调用 API 时(例如在 Web 浏览器中),它返回一个不完整的 JSON 字符串。

这是实例正在序列化的类:

public class Thing
{
    public string Name { get; set; }
    public FileInfo File { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是控制器、程序和启动类:

[Route("Test/Home")]
[ApiController]
public class HomeController : Controller
{
    [HttpGet]
    public async Task<ActionResult<Thing>> GetThing()
    {
        return new Thing()
        {
            Name = "First thing",
            File = new FileInfo("c:\file.txt")
        };
    }
}

public class Program
{
    public static async Task Main(string[] args) 
        => await CreateWebHostBuilder(args).Build().RunAsync();

    public static …
Run Code Online (Sandbox Code Playgroud)

.net c# json json.net asp.net-core

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

.NET Core 3 中不会触发 shouldSerialize 方法

我通常ShouldSerialize用来排除没有数据的属性,例如数组,但现在,当我只在.NET Core 3. 它在使用时被触发,NewtonSoft但我已将它从我的项目中删除,因为它似乎不再需要。

例如:

    private ICollection<UserDto> _users;

    public ICollection<UserDto> Users
    {
        get => this._users ?? (this._users = new HashSet<UserDto>());
        set => this._users = value;
    }

    public bool ShouldSerializeUsers()
    {
        return this._users?.Count > 0;
    }
Run Code Online (Sandbox Code Playgroud)

为什么没有触发 ShouldSerializeUsers 的任何想法?

我已经看到其他可以使用的答案:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddJsonOptions(options => { 
        options.SerializerSettings.NullValueHandling = 
        NullValueHandling.Ignore;
    });
}
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有另一种方法来处理这个问题,因为我没有使用 .AddMvc

谢谢。

c# serialization json asp.net-core asp.net-core-webapi

4
推荐指数
2
解决办法
1667
查看次数

ASP.NET Core 3.0 System.Text.Json Camel案例序列化

在ASP.NET Core 3.0 Web API项目中,如何指定System.Text.Json序列化选项以自动将Pascal Case属性序列化/反序列化为Camel Case,反之亦然?

给定具有Pascal Case属性的模型,例如:

public class Person
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

以及使用System.Text.Json将JSON字符串反序列化为Person类类型的代码:

var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}";
var person = JsonSerializer.Deserialize<Person>(json);
Run Code Online (Sandbox Code Playgroud)

除非将JsonPropertyName与以下每个属性一起使用,否则不会成功反序列化:

public class Person
{
    [JsonPropertyName("firstname")
    public string Firstname { get; set; }
    [JsonPropertyName("lastname")
    public string Lastname { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我在中尝试了以下方法startup.cs,但在仍然需要方面没有帮助JsonPropertyName

services.AddMvc().AddJsonOptions(options =>
{
    options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
    options.JsonSerializerOptions.PropertyNamingPolicy = …
Run Code Online (Sandbox Code Playgroud)

c# json asp.net-core system.text.json

3
推荐指数
6
解决办法
1774
查看次数