4

token.TypeJSON 文字列を解析し、プロパティを使用して type の値を検出したいと思いますJTokenType.TimeSpan

入力文字列で TimeSpan を表現する方法がわかりません。すべてが JTokenType.String として解釈されるようです。

var timeSpanString = TimeSpan.FromHours(1).ToString();
testString = string.Format(@"{{""Value"": ""{0}"" }}", timeSpanString);
var statObject = JObject.Parse(testString);
JToken token = statObject["Value"];
var tokenValue = token.ToString();
var tokenType = token.Type; // JTokenType.String

私も試しました:

JValue jValue = new JValue("test");
jValue.Value = TimeSpan.FromHours(1);
bool isTimeSpan = jValue.Type == JTokenType.TimeSpan; // true!
testString = string.Format(@"{{""Value"": ""{0}"" }}", jValue.Value);
var statObject = JObject.Parse(testString);
JToken token = statObject["Value"];
var tokenValue = token.ToString();
var tokenType = token.Type; // JTokenType.String

少なくとも tokenType JTokenType.TimeSpan のJValueオブジェクトを生成しますが、解析すると JTokenType.String として表示されます。

これは、DateTime オブジェクトに対して完全に機能します。解析された値の型が であるような入力文字列を表現するにはどうすればよいJTokenType.TimeSpanですか?

4

3 に答える 3

6

JSON.NET をしばらく使用している間に私が見たことに基づいて、デフォルト設定では、文字列を解析し、タイプを指定してトークンを取得することは決してありませんJTokenType.TimeSpan(Guid や Uri などの他のタイプでも同じです)。 . なぜそうなのかはかなり推測できます (数年前に で作業した経験に基づいていますDataContractJsonSerializer)。

基本的には、パーサーが入力からどれだけの情報を取得できるかの問題です。JSON は、(配列とオブジェクトに加えて)数値ブール値、および文字列のみを認識する非常に単純な構文です。多くの CLR 型にはネイティブの JSON 型 (Uri、DateTime、DateTimeOffset、TimeSpan など) がありません。そのため、JSON パーサーがデータを読み取るときに、最も一致するものを使用しようとします。

JSON 文字列を CLR データ型に逆シリアル化する場合、シリアライザーには、JSON 文字列が何にマップされるかを明確にするために使用できる追加情報 (値が逆シリアル化されるフィールド/プロパティの型) があります。ただし、JSON データをJTokenオブジェクト グラフに逆シリアル化する場合、追加情報はなく、JSON.NET は 1 つの型を選択する必要があります。JSON 文字列を逆シリアル化する最も自然な型は、まあ、CLR 文字列です。

しかし、なぜ日付は正しく逆シリアル化されるのJTokenType.Dateでしょうか? IIRC、JSON.NET リーダーには、日付の特別なコード (DateParseHandling列挙によって制御される) があり、解析された文字列をいくつかの事前定義された形式 (ISO 8601 または古い Microsoft ASP.NET AJAX 形式) に一致させようとします。一致する文字列の場合、文字列ではなくDateTime(またはDateTimeOffset) として読み取ります。その動作を拡張して他のタイプをサポートできるかどうかはわかりませんがTimeSpan、JSON.NET の拡張性は非常に優れているため、驚くことではありません。

于 2012-11-22T04:29:59.487 に答える
2

TimeSpan を解析しようとしている場合は、引用符で囲む必要があります: '"12:00:00"'

TimeSpan をシリアル化し、文字列の結果を確認すると、"\"12:00:00\"" のようになります。

少なくとも、これは NewtonSoft.JsonConvert を使用して私にとってはうまくいきました。私のDB「12:00:00」の文字列(引用符を含む)。

JsonConvert.DeserializeObject(dbString) を使用すると、正常に返されます。

于 2016-05-20T21:59:56.200 に答える