C# System.Text.Json反序列化uint

C# System.Text.Json反序列化uint,c#,json,asp.net-mvc,json-deserialization,system.text.json,C#,Json,Asp.net Mvc,Json Deserialization,System.text.json,因此,新的Json库似乎没有对UInt32类型进行反序列化(甚至序列化)。在MVC应用程序中,在POST的有效负载中发送以下内容: { "Overrides":{ }, "Directions":{ "data1" : "data2" }, "ModeId": "1782354543", "TestN

因此,新的Json库似乎没有对
UInt32
类型进行反序列化(甚至序列化)。在MVC应用程序中,在POST的有效负载中发送以下内容:

{
   "Overrides":{
      
   },
   "Directions":{
      "data1" : "data2"
   },   
   "ModeId": "1782354543",
   "TestNumber" : 10
}
它应该序列化到的类如下所示:

public class Payload
    {
        public uint ModeId;
        public Dictionary<string, string> Directions{ get; set; } = new();
        public Dictionary<string, string> Overrides { get; set; } = new();
        public int TestNumber { get; set; }
    }
services.AddControllers()
                .AddJsonOptions(options =>
                {
                    options.JsonSerializerOptions.WriteIndented = false;
                    options.JsonSerializerOptions.IgnoreNullValues = true;
                    options.JsonSerializerOptions.PropertyNamingPolicy = null;
                    options.JsonSerializerOptions.Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping;
                    options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
                    options.JsonSerializerOptions.Converters.Insert(options.JsonSerializerOptions.Converters.Count,new UIntConverter());

                });
然后像这样注册它:

public class Payload
    {
        public uint ModeId;
        public Dictionary<string, string> Directions{ get; set; } = new();
        public Dictionary<string, string> Overrides { get; set; } = new();
        public int TestNumber { get; set; }
    }
services.AddControllers()
                .AddJsonOptions(options =>
                {
                    options.JsonSerializerOptions.WriteIndented = false;
                    options.JsonSerializerOptions.IgnoreNullValues = true;
                    options.JsonSerializerOptions.PropertyNamingPolicy = null;
                    options.JsonSerializerOptions.Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping;
                    options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
                    options.JsonSerializerOptions.Converters.Insert(options.JsonSerializerOptions.Converters.Count,new UIntConverter());

                });
我甚至无法使用相同的转换器将类序列化为字符串。它只是忽略uid属性

var payload = new Payload()
{
   Directions = new Directions
   {
     {"data1", "data2" }
   },
   ModeId = 1782354543,
   TestNumber = 10
}
//then try to serialize
var defaultJsonSerializerSettings = new JsonSerializerOptions()
        {
            IgnoreNullValues = true,
            WriteIndented = false,
            PropertyNamingPolicy = null,
            Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
            Converters = { new UIntConverter()}            
        };
Serializer.Serialize(payload, typeof(Payload), defaultJsonSerializerSettings); 
它序列化所有内容,但uint属性除外,该属性被完全忽略

对于uint属性的序列化/反序列化,您有什么建议/建议


[更新]:问题在于,我试图序列化/反序列化一个字段,而不是回答中指出的具有公共访问器的属性。碰巧字段的类型是
uint

,如果您在.NET 5上,或者如@Jimi所指出的那样,如果安装
,那么您可以使用
includefelds
allowroadingfromstring
选项:

var serializeOptions = new JsonSerializerOptions
{
    IncludeFields = true,
    NumberHandling = JsonNumberHandling.AllowReadingFromString
};

var p = JsonSerializer.Deserialize<Payload>(json, serializeOptions);
如果您需要保留
ModeId
name,那么您可以

public class Payload
{
   [JsonPropertyName("ModeId")]
   public string modeId {get;set;}

   [JsonIgnore]
   public uint ModeId => uint.Parse(modeId);
}

不幸的是,在3.1中,您需要将字符串变量保持为公共(反序列化privates可从v5获得)。

如果您在.NET 5上,或者如@Jimi所指出的那样,如果安装
,那么您可以使用
IncludeFields
allowaradingfromstring
选项:

var serializeOptions = new JsonSerializerOptions
{
    IncludeFields = true,
    NumberHandling = JsonNumberHandling.AllowReadingFromString
};

var p = JsonSerializer.Deserialize<Payload>(json, serializeOptions);
如果您需要保留
ModeId
name,那么您可以

public class Payload
{
   [JsonPropertyName("ModeId")]
   public string modeId {get;set;}

   [JsonIgnore]
   public uint ModeId => uint.Parse(modeId);
}

不幸的是,在3.1中,您需要将字符串变量保持为public(反序列化privates可从v5中获得)。

可能的原因:也就是说,您在
public uint ModeId中缺少
{get;set;}
(这是故意的吗?),那么转换器就可以工作了。-<代码>=new()
不需要。uint可以工作fine@KeithNicholas Yep,在选项中设置
NumberHandling=JsonNumberHandling.allowaradingfromstring
。或包括字段,设置
includefelds=true
。这么多的可能性…可能的原因是:也就是说,您在
公共uint ModeId中缺少
{get;set;}
(这是故意的吗?),那么转换器就可以工作了。-<代码>=new()
不需要。uint可以工作fine@KeithNicholas Yep,在选项中设置
NumberHandling=JsonNumberHandling.allowaradingfromstring
。或包括字段,设置
includefelds=true
。这么多的可能性……这当然是正确的,但重要的不是.Net版本,而是
System.Text.Json
版本。您也可以将v.5.0.2添加到.Net Framework中,这正是您想要表达的意思。@Jimi很好。谢谢你们两位提供的线索。吉米所指出的问题是这个领域。正如你所说,它不需要转换器。我使用的是.net5和System.Text.Json 5.0.2这当然是正确的,但这不是.Net版本,重要的是
System.Text.Json
版本。您也可以将v.5.0.2添加到.Net Framework中,这正是您想要表达的意思。@Jimi很好。谢谢你们两位提供的线索。吉米所指出的问题是这个领域。正如你所说,它不需要转换器。我使用的是.net5和System.Text.Json 5.0.2