2017-10-04 18 views
1

奇妙なバグが私の頭を打ち負かしていました。フィールド上のトラフィックを最小限に抑えるために、フィールド名はマッピングされ、収縮され、その後、もう一方の端で膨らまされます。フィールド名が 'h'で、データがdatetimeの場合、コンバータは次のようにクラッシュします。JsonConvert.DeserializeObjectのバグ<DataSet>

Newtonsoft.Json.JsonSerializationException {値9/29/2017 10:06:00 AMから ' System.Double '。パス' dSTD [0] .h '、行1、位置293。 "}内部例外が' DateTime 'から' Double 'への無効なキャストを含む。

以下のc#サンプルでは、​​最初のデータセット(jsonDtA)がコンバータをクラッシュさせ、2番目のデータ(jsonDtB)はクラッシュしません。

string jsonDtA = "{'dSTD':[{'v':'7ac36696-9977-4bf1-b211-1be2a01da04d','av':820210,'l':'72a9f721-86e0-4070-9cd9-dfa9d3c4efdd','ab':726943,'N':1,'A':'Y','B':'N','G':'N','E':'N','D':'N','K':0.0000,'O':1,'L':1.25,'H':1.25,'ac':'ProcessTransaction','ad':5,'ae':'2017-09-29T10:06:00','af':5,'h':'2017-09-29T10:06:00'}]}"; 
string jsonDtB = "{'dSTD':[{'v':'7ac36696-9977-4bf1-b211-1be2a01da04d','av':820210,'l':'72a9f721-86e0-4070-9cd9-dfa9d3c4efdd','ab':726943,'N':1,'A':'Y','B':'N','G':'N','E':'N','D':'N','K':0.0000,'O':1,'L':1.25,'H':1.25,'ac':'ProcessTransaction','ad':5,'ae':'2017-09-29T10:06:00','af':5,'hb':'2017-09-29T10:06:00'}]}"; 

DataSet dsA = JsonConvert.DeserializeObject<DataSet>(jsonDtA); 
DataSet dsB = JsonConvert.DeserializeObject<DataSet>(jsonDtB); 

唯一の違いは、私の「修正」はちょうど私に「h」を使用しないことですもちろん「HB」対「H」

、JSONセットの最後のデータフィールドの名前です。デフレーションマップ...

なぜ、これはどうして起こりますか?それはバグでしょうか?

私は大文字と小文字を区別しませんDataTableオブジェクトにNewtonsoft.Json v10.0.3

+0

が見えますそれは問題と思われる。これはおそらくJson.NETのバグではなく、あなたのコードにあります。 – TylerBrinkley

答えて

3

列名を使用しています。何が起こっているのは、データにHという列がすでにあり、その列のデータ型が1.25のためdoubleに設定されているということです。したがって、hのプロパティに日付が含まれていると、Json.Netは元のdouble値を上書きしようとします。互換性のない型のために爆発します。 hhbに変更することで、すべての列が固有の名前を持つようになるため、この問題を回避できます。ここで

は完全に式のうち、Json.Netを取って、問題を示して短いフィドルです:あなたがに「H」値をデシリアライズしているものは何でも ``のDateTimeないdouble`ているようhttps://dotnetfiddle.net/bgmFsB

+0

ブライアンに感謝します。私の脳は大文字と小文字の区別を前提としています。私の収縮と膨張は簡潔さのために混じり合っていました。膨張/収縮には大いに役立ちますが、大文字と小文字を区別しないシリアライズと組み合わせて爆発しました。私の頭を正しくねじ戻してくれてありがとう;) –

+0

心配はありません。 DataTableの列名は大文字と小文字を区別しないようにするのが直感的ではありません。したがって確認する唯一の方法は実験によるものです。おそらく、DataTableはSQLテーブルをミラーリングするためのもので、少なくともSQL Serverではデフォルトでは大文字と小文字を区別しません。とにかく、私は神秘を解決するのを助けることができてうれしいです。 –

関連する問題