【.NET】DateTime content does not start with '\/Date(' and end with ')\/'

ネコニウム研究所

PCを利用したモノづくりに関連する情報を掲載するブログ

【.NET】DateTime content does not start with '\/Date(' and end with ')\/'

2022-10-18 | , ,

.NETでDateTime content does not start with '\/Date(' and end with ')\/'をどうにかしたい!

概要

今回の記事では、.NETでDateTime content does not start with '\/Date(' and end with ')\/'が出力される原因と対応手順を掲載する。

エラーメッセージの全文は下記のような感じ。

DateTime content does not start with '\/Date(' and end with ')\/'
There was an error deserializing the object of type <ClassName>`[<project_namespace>.<ClassName>, <project_namespace>, Version=x.x.x.x, Culture=neutral, PublicKeyToken=null]. DateTime content 'yyyy-MM-dd HH:mm:dd' does not start with '\/Date(' and end with ')\/' as required for JSON.

仕様書

環境

  • .NET 5.0

原因

JSONからにオブジェクトにデシリアライズする際にオブジェクトにDateTimeが含まれてる場合にJSON側の該当のデータが/Date(')/の間に入力されてないとこのエラーが発生する。

例として下記のようなJSONを

{
    "id": "1",
    "created_at": "2022-10-18 12:00:00"
}

下記のようなクラスのオブジェクトにデシリアライズしようとするとこのエラーが再現する。

[DataContract]
public class JsonObject
{
    [DataMember]
    public int id;
    [DataMember]
    public DateTime created_at;
}

手順書

JSON側で対応する場合は、エラーのメッセージで指示されてるとおりに/Date(')/の間に2022-10-18 12:00:00を入力するようにする。

{
    "id": "1",
    "created_at": "/Date(2022-10-18 12:00:00)/"
}

前述のJSON側での対応ができない環境の場合、C#側であえて一旦string型を指定してデシリアライズしてしまう方法もありかもしれない。

[DataContract]
public class JsonObject
{
    [DataMember]
    public int id;
    [DataMember]
    public string created_at;
}

まとめ(感想文)

いろいろな対応方法を知ってると様々なケースに対応できるかもね!