2016-07-20 9 views
2

驚くべき結果を得て、標準のBCL DateTimeクラスの代わりにプロジェクトを通してNodaTimeを使用しています。Newtonsoft JToken.ToObjectを使用して<T>を非直列化に変換するインスタント

プロジェクトから完全にDateTimeを取り消したいと思います。私は1つの場所でのみ使用しています - 日付を含む大きなJSONファイルをデシリアライズします。これらの日付は常に UTCで、は常にで、ISO 8601形式で指定されています。

using Newtonsoft.Json; 
using Newtonsoft.Json.Linq; 
using Newtonsoft.Json.Schema; 

namespace Foo.Parsing 
{ 
public class Parser 
{ 
    JSchema schema; 
    JObject jsonObject; 

    public Parser(string jsonContent, string schemaString) 
    { 
     schema = JSchema.Parse(schemaString); 
     jsonObject = JObject.Parse(jsonContent); 
    } 

    public MyObject Parse() 
    { 
     return jsonObject.ToObject<MyObject>(); 
    } 
} 

public class MyObject 
{ 
    [JsonProperty(Required = Required.Always)] 
    public DateTime date { get; set; } 

    // A lot of other properties here. 
} 
} 

このすべてが非常にうまく動作しますが、現時点では、私はインスタントに日付時刻を変換するInstant.FromDateTimeUtc(myObject.date);を使用する必要があります。 MyObjectに内部私は日付時刻を持っていると私はインスタントにこれを変更しようとすると、私は次のエラーを取得する:

Newtonsoft.Json.JsonSerializationException' in Newtonsoft.Json.dll Additional information: Error converting value 2016/07/07 12:00:00 AM to type 'NodaTime.Instant'. Path 'date', line 4, position 37

は私が私の日付が直接デシリアライズして、私の強く型付けされたMyObjectにへの私のJSONファイルをデシリアライズするための方法はありますDateTimeを変換するのではなく、Instantに変換しますか?

Noda Time User Guideパー
+2

['NodaTime.Serialization.JsonNet'パッケージ](https://www.nuget.org/packages/NodaTime.Serialization.JsonNet)を使用していますか?これに役立つコンバータがあります。これを設定する方法の詳細については、[JSON.NETを使用した野田時刻のLocalDateTimeのデシリアライズ](http://stackoverflow.com/q/21050002/10263)を参照してください。 –

+0

ありがとうございました。私はさらに一歩進んできましたが、 "予期しないトークンを解析して予期せぬトークンを取得しました。"というエラーが表示されています。 JObjectはそれが日付であることをどのように知っていますか?私はMyObject.dateをInstant/DateTimeではなく文字列に設定すると、別の(ISO以外の)形式に戻ってきますので、JObject.Parseの何かが日付としてフォーマットを認識しているようです... – Ivan

答えて

3

  • それでも、その後おそらく、 "予期しないトークン..." のメッセージを取得している場合は、あなたのJsonSerializerSettings

NodaTime.Serialization.JsonNet nugetパッケージに

  • コールConfigureForNodaTimeをインストールします。 DateParseHandling設定を変更しました。 ConfigureForNodaTimeコールでは、これをDateParseHandling.Noneに設定します。このままにしておく必要があります。彼らはまた、JsonConvert.DefaultSettings経由で設定することができJsonSettingsパラメータを、受け入れるようこれは、JsonConvert.SerializeObjectJsonConvert.DeserializeObjectクラスでうまく動作

    注意。 Here is a live demo using this approach

    ただし、JObject APIを使用している場合は、少し問題があります。 JObject.Parseには設定パラメータを設定する機能がありません。デフォルトでは、この段階ではDateParseHandling.Noneが必要になりません。これに対する解決策は、JsonTextReaderを使用することを含み、よくin this StackOverflow answerと記載されている。

  • +0

    いいえ私はデシリアライズする前にConfigureを呼び出す。私は次のように "DateParseHandling.None"を追加しようとしました。まだダイス: 'JsonSerializerシリアライザ=新しいJsonSerializer();' ' serializer.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);' ' serializer.DateParseHandling = DateParseHandling.None;' が 'jsonObject.ToObject (シリアライザ)を返します。 ' – Ivan

    +0

    私の更新された答えを見てください。私は最後の部分があなたの現在の問題に対処すると信じています。 –

    関連する問題