gpt4 book ai didi

c# - Newtonsoft.Json 试图猜测 token 类型并弄错了

转载 作者:太空宇宙 更新时间:2023-11-03 21:01:08 25 4
gpt4 key购买 nike

我正在尝试更改 Newtonsoft 序列化程序处理“2017-05-27”等字符串的方式。

因此,我创建了一个用于代替 DateTime 的类,它是该类型的转换器,我希望它就是它。

问题是,对于“2017-05-27”,它确实有效。但是,如果出于某种原因,我得到“2017-05-27T23:50:27:00”,即一个完整的 ISO 8601 字符串,JsonReader 会假装是智能的并将其视为 DateTime 而不是字符串。

有什么办法可以改变这种行为吗?

到目前为止我完成的代码是这样的:

using System;
using System.Text.RegularExpressions;
using Newtonsoft.Json;

namespace ConverterGames
{
public class MyDate
{
public int Year { get; set; }
public int Month { get; set; }
public int Day { get; set; }
}
public class Xxx
{
public MyDate Aaa { get; set; }
}

public class DateJsonConverter : JsonConverter
{
private readonly Regex _isoDate = new Regex(@"^(\d+)-(\d+)-(\d+).*", RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
// gives "string" for 2017-04-27 :-)
// gives DateTime for 2017-04-27T20:00:00.00 :-(
// I want string only here.
Console.WriteLine(reader.Value.GetType());

Match m = _isoDate.Match((string)reader.Value);
if (!m.Success)
{
throw new Exception($"Format error for {(string)reader.Value}");
}
return new MyDate
{
Year = Int32.Parse(m.Groups[1].Value),
Month = Int32.Parse(m.Groups[2].Value),
Day = Int32.Parse(m.Groups[3].Value),
};
}

public override bool CanConvert(Type objectType)
{
return objectType == typeof(MyDate);
}
}

class Program
{
static void Main()
{
string Data = "{\"aaa\":\"2017-05-12\"}";
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Converters.Add(new DateJsonConverter());

// good
Xxx x= JsonConvert.DeserializeObject<Xxx>(Data, settings);
Console.WriteLine(x.Aaa.Year);


// fails
Data = "{\"aaa\":\"2017-05-12T08:15:00\"}";
x = JsonConvert.DeserializeObject<Xxx>(Data, settings);
Console.WriteLine(x.Aaa.Year);
}
}
}

有什么我可以做的吗?

最佳答案

是的。由于您要自己处理日期解析,因此只需在序列化程序设置中将 DateParseHandling 设置为 None:

JsonSerializerSettings settings = new JsonSerializerSettings();
settings.DateParseHandling = DateParseHandling.None;
settings.Converters.Add(new DateJsonConverter());

fiddle :https://dotnetfiddle.net/3WSj6Q

关于c# - Newtonsoft.Json 试图猜测 token 类型并弄错了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45460708/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com