.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 等。
我正在尝试构建我的 .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 等。