- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 System.Text.Json 和自定义日期时间格式时遇到问题。
我创建了一个自定义转换器,它正在我的 api 项目中运行。当我构建客户端时,我尝试使用相同的类,但是 .Deserialize() 方法不会在我的类的 DateTime 属性上调用 .Read() 。
有人遇到过同样的问题吗?
public class DateTimeConverter : JsonConverter<DateTime>
{
private static readonly string _format = "yyyy-MM-dd'T'HH:mm:ss.fff";
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return DateTime.ParseExact(reader.GetString(), _format, System.Globalization.CultureInfo.InvariantCulture);
}
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
=> writer.WriteStringValue(value.ToUniversalTime().ToString(_format));
}
public async Task<StockUnitInfo> GetStockUnitInfoAsync(Inbound inbound, CancellationToken token = default)
{
var uri = Uri.EscapeUriString($"{_httpClient.BaseAddress}/Readers/{inbound.Position}/StockUnits/{inbound.Barcode}");
var test = await _httpClient.GetStringAsync(uri);
var response = await _httpClient.GetStreamAsync(uri);
var _serializationOptions = new JsonSerializerOptions
{
Converters = { new DateTimeConverter() }
};
return await JsonSerializer.DeserializeAsync<StockUnitInfo>(response, _serializationOptions, token);
}
public class StockUnitInfo
{
public string barcode { get; set; }
public string wms_batch_id { get; set; }
public string gtin { get; set; }
//[JsonConverter(typeof(DateTimeConverter))]
public DateTime sort_date { get; set; }
public string talleys_batch_number { get; set; }
public int expected_batch_size { get; set; }
public string destination { get; set; }
public bool fast_mover { get; set; }
public int stackable { get; set; }
public string message { get; set; }
}
根据要求的最小可重现示例:
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
class Program
{
public class DateTimeConverter : JsonConverter<DateTime>
{
//private static readonly string _format = "yyyy.MM.dd'T'HH:mm:ss.fff'Z'"; //formato api?
private static readonly string _format = "yyyy-MM-dd'T'HH:mm:ss.fff";
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return DateTime.ParseExact(reader.GetString(), _format, System.Globalization.CultureInfo.InvariantCulture);
}
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
=> writer.WriteStringValue(value.ToUniversalTime().ToString(_format));
}
public class StockUnitInfo
{
public string barcode { get; set; }
public string wms_batch_id { get; set; }
public string gtin { get; set; }
//[JsonConverter(typeof(DateTimeConverter))]
public DateTime sort_date { get; set; }
public string talleys_batch_number { get; set; }
public int expected_batch_size { get; set; }
public string destination { get; set; }
public bool fast_mover { get; set; }
public int stackable { get; set; }
public string message { get; set; }
}
public static void Main(string[] args)
{
string json = "{\"barcode\":\"201930823\",\"wmsBatchId\":\"c3e4d921-8779-46f7-ac28-b1f523845329\",\"gtin\":\"01080\",\"sortDate\":\"2019-09-20T11:59:59.999\",\"talleysBatchNumber\":\"STK0233\",\"expectedBatchSize\":1,\"destination\":\"5A05\",\"fastMover\":false,\"stackable\":0,\"message\":\"Pallet directed to CS4\"}";
var _serializationOptions = new JsonSerializerOptions
{
Converters = { new DateTimeConverter() }
};
var result = JsonSerializer.Deserialize<StockUnitInfo>(json, _serializationOptions);
Console.WriteLine(result.sort_date);
Console.Read();
}
}
最佳答案
出现这种情况的原因是类属性的名称和Json属性的名称不同:
"sortDate": "2019-09-20T11:59:59.999"
还有
public DateTime sort_date { get; set; }
为了反序列化该 json,您需要使名称相同,或者通过添加属性来告诉序列化程序要执行的操作来告诉等效名称是什么:
// For NewtonSoft.Json
// [JsonProperty("sortDate")]
// For System.Text.Json
[JsonPropertyName("sortDate")]
public DateTime sort_date { get; set; }
添加后,您的示例代码将正确运行:
关于c# - System.Text.Json 自定义 JsonConverter<DateTime> .Read() 方法未被 .Deserialize() 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59733697/
编辑:澄清问题: 我已经覆盖了基类型的 JsonConverter(通过将 [JsonConverter(typeof(TConverter))] 应用于父类(super class)),但是当直接反
尝试使用 JsonConvert.PopulateObject 更新类属性时,未调用 JsonPathConverter,因此未完成填充。 示例类: [JsonConverter(typeof(Jso
我有一个我不能改变的类: public enum MyEnum { Item1 = 0, Item2 = 1 } public class foo { [JsonConvert
我正在使用 Json.NET (6.0.3) 进行序列化。我编写了一个自定义 JsonConverter TestConverter 来处理一些 BaseClass 的实例(通过将它们转换为整数 id
我有一个要求,我需要将默认值设置为下面的复杂属性 Instances使用 JsonProperty和 DefaultValue . 我知道我们可以为以下链接中提到的原始属性实现这一点,但需要知道我们如
我尝试查找上述比较,但找不到答案。 因为有多种方法可以获取 JObject(或所有继承自 JToken 的子类型)例如: Method1 . JObject.FromObject(obj); Meth
我已启用我的 API 以使用字符串值序列化/反序列化枚举。为此,我已将 JsonStringEnumConverter 添加到 API 的 Startup 类中受支持的 JsonConverter 列
我有一个 Employee 类,其中 Manager 属性本身是 Employee 类型 public class Employee { public string FirstName { g
我已经卡住模型(简化): part 'initial_data_model.freezed.dart'; part 'initial_data_model.g.dart'; @freezed clas
我正在尝试将两个字段和一个包含两个字段的捆绑对象发布到 Mailchimp 的 API 端点。 var store_id = ConfigurationManager.AppS
以下VB.NET代码使用Newtonsoft JSON.NET库,并在按钮单击事件处理程序中执行并阻止UI线程: Dim table As DataTable = Await Task.Factory
我遇到了一个问题,其中以下 ToJson() 方法返回的字符串仅为“{}” public class GenericRequest { publ
这个问题在这里已经有了答案: JSON Can't be Deserialized to Object, Needs Array? (2 个答案) 关闭 9 年前。 我有这个 Json 返回: [
我遇到了一个问题,其中以下 ToJson() 方法返回的字符串仅为“{}” public class GenericRequest { publ
这个问题在这里已经有了答案: JSON Can't be Deserialized to Object, Needs Array? (2 个答案) 关闭 9 年前。 我有这个 Json 返回: [
我创建了一个简单的类: public class TestObject { public TestObject(int id, string name, List list) {
我有一个像这样的 Json 对象: {"company": "My Company", "companyStart" : "2015/01/01", "employee" : { "name"
这是 json: { "odata.metadata": ".....", "value": [ { "AbsEntry": 10,
我有一个对象,其中包含一个具有 JsonConverter 属性的属性。对于数据读写,转换器不工作。声明的属性是 [JsonConverter(typeof(EpochDateTimeConverte
编辑:制作了一个更简单、更透明的示例案例 我正在尝试反序列化一组组件(属于一个实体)。其中一个组件是 Sprite 组件,它包含纹理和动画信息。我为此实现了一个 CustomConverter,因为原
我是一名优秀的程序员,十分优秀!