.Net Core 3.0 对象类型设置值

.Net Core 3.0 object Type set value

我正在尝试构建我的 .net core 3.0 web api 项目,但在过去 4 天停留在一个声明上。 这是我的问题。我有一个名为 "GridFilter" 的过滤模型,该模型如下所示:

    public class GridFilter
    {
         public string Operator { get; set; }
         public string Field { get; set; }
         public object Value { get; set; }
         public object Value2 { get; set; }
         public string Logic { get; set; }
    }

在这个模型中,我在过滤任何模型之前将 Value 和 Value2 作为对象,我通过 Universal Type Converter 将这个值转换为相关的列类型。我在 .netfreamwork 中使用了这个系统,效果很好。但是在 .net core 3.0 中,当我请求这个模型填充时是这样的: Model

Operator: "eq"
Logic: null
Value: ValueKind = Number : "10000"
Value2: null
Field: "SCT_CATEGORY"

要求: {"filter": {"filters": [{"field": "SCT_CATEGORY", "value": 10000, "operator": "eq"}]}}

我连续搜索了 4 天,无法解决这个问题。我正在尝试这样填写它:

Operator: "eq"
Logic: null
Value: 10000
Value2: null
Field: "SCT_CATEGORY"

我该如何解决这个问题。 谢谢!

编辑

  [Route("[action]")]
    [HttpPost]
    public async Task<Response> List([FromBody]GridFilter request)

我的 ConfigureServices 是这样的:

services.AddControllers()
                .AddJsonOptions(o =>
                {
                    o.JsonSerializerOptions.PropertyNamingPolicy = null;
                    o.JsonSerializerOptions.DictionaryKeyPolicy = null;
                });

在这个片段中,我正在为流利的 nhibarte 构建我的过滤器

  internal static MyCriteria BuildFilter(ISession sess, GridFilter gf)
    {
        MyCriteria mc = null;
        var t = !string.IsNullOrEmpty(gf.Field)
            ? TypeHelper.GetType(typeof(T).GetProperty(gf.Field))
            : null;

        if (t == typeof(char) && (!new[] { "eq", "neq" }.Contains(gf.Operator)))
        {
            gf.Operator = "eq";
        }

        switch (gf.Operator)
        {
            case "eq":
                mc = gf.Value == null ? new MyCriteria { cr = Restrictions.IsNotNull(gf.Field), logic = gf.Logic.ToEnum(Logic.and) } : new MyCriteria { cr = Restrictions.Eq(gf.Field, ChangeType(gf.Value, t)), logic = gf.Logic.ToEnum(Logic.and) };
                break;...

我的更改类型是这样的:

internal static object ChangeType(object value, Type conversionType)
        {
            try
            {
                object result;
                UniversalTypeConverter.TryConvert(value, conversionType, out result);
                return result;
            }
            catch (Exception)
            {
                return false;
            }
        }

此时我需要转换 "10000" 而不是 ValueKind = Number : "10000"

如果没有你的反序列化代码,很难这么说,但是:这很好用:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;

static class Program
{
    static void Main()
    {
        var request = @"{""filter"": {""filters"": [{""field"": ""SCT_CATEGORY"", ""value"": 10000, ""operator"": ""eq""}]}}";
        var obj = JsonConvert.DeserializeObject<Request>(request);
        var filter = obj.Filter.Filters.Single();
        Console.WriteLine(filter.Operator); // "eq"
        Console.WriteLine(filter.Logic); // null
        Console.WriteLine(filter.Value); // 10000
        Console.WriteLine(filter.Value2); // null
        Console.WriteLine(filter.Field); // SET_CATEGORY
    }
}
public class Request // just to shape the json
{
    public RequestFilters Filter { get; set; }
}
public class RequestFilters // just to shape the json
{
    public List<GridFilter> Filters { get; } = new List<GridFilter>();
}
public class GridFilter
{
    public string Operator { get; set; }
    public string Field { get; set; }
    public object Value { get; set; }
    public object Value2 { get; set; }
    public string Logic { get; set; }
}

如果您还希望能够序列化 保留大小写,您需要告诉序列化程序:

public class Request // just to shape the json
{
    [JsonProperty("filter")]
    public RequestFilters Filter { get; set; }
}
public class RequestFilters // just to shape the json
{
    [JsonProperty("filters")]
    public List<GridFilter> Filters { get; } = new List<GridFilter>();
}
public class GridFilter
{
    [JsonProperty("operator")]
    public string Operator { get; set; }
    [JsonProperty("field")]
    public string Field { get; set; }
    [JsonProperty("value")]
    public object Value { get; set; }
    [JsonProperty("value2")]
    public object Value2 { get; set; }
    [JsonProperty("logic")]
    public string Logic { get; set; }
}

正如其中一条评论所说,这种行为变化是由于 .NET Core 3.0 将其 Json 序列化引擎从 Newtonsoft 替换为 System.Text.Json。

我看到两个选项供您选择:

首先是将默认的 Json 序列化程序改回 Newtonsoft。有关如何操作的详细信息,请参见此处:

第二个选项是编写您自己的custom converter。我可以想象这个转换器试图解析所有已知类型,首先获取成功。例如。 Int.TryParse、DateTime.TryParse 等。