C# System.Text.Json反序列化uint
因此,新的Json库似乎没有对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
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