2017-10-04 1 views
1

Ein seltsamer Fehler ließ mich meinen Kopf schlagen. Um den Verkehr über den Draht zu minimieren, werden die Feldnamen zugeordnet und entleert und dann am anderen Ende aufgeblasen. Wenn der Feldname ‚h‘ ist und die Daten ein Datetime, wird der Konverter Absturz mit:Fehler in JsonConvert.DeserializeObject <DataSet>

Newtonsoft.Json.JsonSerializationException { "Fehler beim Konvertieren Wert 2017.09.29 10.06.00 eingeben ' System.Double '. Pfad' dSTD [0] .h ', Zeile 1, Position 293. "} mit einer inneren Ausnahme von ungültiger Umwandlung von' DateTime 'nach' Double '.

Im folgenden Beispiel C# stört der erste Satz von Daten (jsonDtA) den Konverter, der zweite (jsonDtB) nicht.

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); 

Der einzige Unterschied ist der Name des letzten Datenfeldes in dem json Satz, 'h' vs. 'hb'

Natürlich mein "fix" zu verwenden ist einfach nicht 'h' in meiner Deflation Map ...

Die Frage ist, warum passiert das, und ist es ein Fehler?

Ich verwende Newtonsoft.Json v10.0.3

+0

Sieht aus wie, was auch immer du bist Deserialisieren das ‚h‘ Wert ist ein 'double' kein' Datetime "Das scheint das Problem zu sein. Dies ist höchstwahrscheinlich kein Fehler in Json.NET, sondern in Ihrem Code. – TylerBrinkley

Antwort

3

Spaltennamen in DataTable Objekte werden nicht beachtet werden. Was passiert ist, dass Sie in Ihren Daten bereits eine Spalte mit dem Namen H haben und der Datentyp dieser Spalte aufgrund des Werts 1.25 auf double gesetzt wird. Wenn also die h -Eigenschaft mit einem Datum kommt, versucht Json.Net, den ursprünglichen doppelten Wert zu überschreiben, der aufgrund der inkompatiblen Typen explodiert. Indem Sie h zu hb ändern, vermeiden Sie das Problem, weil jetzt alle Ihre Spalten eindeutige Namen haben, wie sie sollten.

Hier ist eine kurze Geige, die das Problem veranschaulicht, Json.Net aus der Gleichung nehmen ganz: https://dotnetfiddle.net/bgmFsB

+0

Danke Brian. Von C# her kommend, geht mein Gehirn von der Groß-/Kleinschreibung aus, meine Deflation und Inflation wurde der Kürze wegen so gemischt, Caps und niedriger, um den Countdown zu halten. Funktioniert hervorragend zum Aufblasen/Entleeren, aber in Kombination mit der Groß-/Kleinschreibung ohne Beachtung der Groß- und Kleinschreibung ist es in die Luft gegangen. Danke, dass du mir den Kopf richtig anschraubst;) –

+0

Keine Sorge; Es ist nicht intuitiv, dass DataTable-Spaltennamen die Groß-/Kleinschreibung nicht beachten sollten, und ich konnte nichts in der MS-Dokumentation finden, die dies ausdrücklich angibt. Der einzige Weg, dies zu bestätigen, ist das Experimentieren. Es geht wahrscheinlich auf die Tatsache zurück, dass DataTables dazu gedacht sind, SQL-Tabellen zu spiegeln, und diese sind standardmäßig zumindest in Groß- und Kleinschreibung in SQL Server nicht berücksichtigt. Wie auch immer, froh, dass ich helfen konnte, das Geheimnis zu lüften. –

Verwandte Themen