为什么 Newtonsoft.Json.JsonConvert.SerializeObject 用引号将结果括起来?[复制]

Why Does Newtonsoft.Json.JsonConvert.SerializeObject Surround Result With Quotes? [duplicate]

提问人:Nick 提问时间:1/28/2020 更新时间:1/28/2020 访问量:2549

问:

此示例代码

DateTime date = new DateTime(2020, 01, 27);
string str = Newtonsoft.Json.JsonConvert.SerializeObject(date, Newtonsoft.Json.Formatting.None,
    new Newtonsoft.Json.JsonSerializerSettings() {
         DateFormatHandling = Newtonsoft.Json.DateFormatHandling.IsoDateFormat });

返回 str = “\”2020-01-27T00:00:00\“” - 因此字符串的内容用引号括起来(这里以转义形式编写,就像调试器一样)。

但我只想要 ISO 格式的日期和时间。为什么会有引号?我怎样才能避免它们而不在事后删除它们?

我已经查找了所有序列化程序选项,但没有找到对我有帮助的选项......

C# JSON 序列化 json.net

评论

4赞 dbc 1/28/2020
因为 Json.NET 是一个 JSON 序列化程序,但 JSON 没有日期和时间的基元格式,所以将 a 序列化为 JSON 字符串基元,这是 JSON 标准要求引用的。DateTime
1赞 Jesse 1/28/2020
引号是为了满足字符串的 json 语法,因为没有像整数那样的全局日期时间对象。
0赞 LinkedListT 1/28/2020
您必须设置日期时间的格式。c-sharpcorner.com/blogs/......
1赞 dbc 1/28/2020
这些评论是否回答了您的问题,或者您还需要一些帮助?你想解决什么问题?给定一个 DateTime 对象,如何获取字符串格式的 ISO 8601 日期?
1赞 dbc 1/28/2020
这个答案 给定一个 DateTime 对象,如何获取字符串格式的 ISO 8601 日期?似乎显示了你想要的内容,请参阅 dotnetfiddle.net/AMKLKo。或者你可以在某处添加一个 const 字符串: .public class Constants { public const string IsoDateTimeFormat = "yyyy’-‘MM’-‘dd’T’HH’:’mm’:’ss.fffffff"; }

答:

1赞 Anu Viswan 1/28/2020 #1

如果查找 Json 规范,您会注意到它不包含 DateTime 的正确定义。

这就是默认情况下,Json.Net 使用 ISO 规范表示形式将 DateTime 表示为字符串的原因。话虽如此,另一种表示方式是使用 .JavaScriptDateTimeConverter

这并不完全是 ISO 规范,甚至根据规范(在上面的链接中给出)也不是有效的 JSON,但 Json.Net 确实支持它。例如

var  data = new Person{Name= "ABC", Dob= new DateTime(2020, 01, 27)};
string str = Newtonsoft.Json.JsonConvert.SerializeObject(data,new JavaScriptDateTimeConverter());

输出

{"Name":"ABC","Dob":new Date(1580063400000)}

请注意,您还需要使用 for 反序列化。JavaScriptDateTimeConverter

var dt = JsonConvert.DeserializeObject<Person>(str,new JavaScriptDateTimeConverter());