Dieses Problem wirkt sich mein ASP.Net WebAPI Patch-Methode, die viel wie folgt aussieht:Json.Net DeserializeObject mit OData.Delta versagt - nur ganze Zahlen
public MyModel Patch(int id, [FromBody]Delta<MyModel> newRecord){/*stuff here*/}
Aber es ist nicht WebAPI das ist das Problem - das Scheitern ist zwischen Json.Net und OData.Delta.
Das Problem ist JsonConvert.DeserializeObject keine Ganzzahlen von OData.Delta-Objekte und ich frage mich, ob es eine Problemumgehung oder eine Lösung gibt, die ich anwenden kann.
UPDATE: Haben geschriebenen Code (siehe unten rechts) in der Json.Net-Bibliothek, die das beheben wird. Nur müssen sie im nächsten Update enthalten sein
UPDATE 2 (wenn James Newton-King es erlaubt): Nach weiteren Tests habe ich die beste Vorgehensweise entschieden wird, mit OData.Delta zu stoppen und schreiben meine eigene (siehe Antwort)
Unit-Tests besteht das Problem
Test 1 (unter Verwendung von Aussagen für Klarheit bewegt unten) zu beweisen: schlägt mit einem int (Int32):
class TestObjWithInt
{
public int Int { get; set; }
}
[TestMethod]
public void IsApplied_When_IntIsDeserializedToDelta()
{
string testData = "{\"Int\":1}";
var deserializedDelta = JsonConvert.DeserializeObject<Delta<TestObjWithInt>>(testData);
var result = deserializedDelta.GetChangedPropertyNames().Contains("Int");
Assert.IsTrue(result);
}
Te 2 st: Gelingt es mit einem langen (Int64)
class TestObjWithLong
{
public long Long { get; set; }
}
[TestMethod]
public void IsApplied_When_LongIsDeserializedToDelta()
{
string testData = "{\"Long\":1}";
var deserializedDelta = JsonConvert.DeserializeObject<Delta<TestObjWithLong>>(testData);
var result = deserializedDelta.GetChangedPropertyNames().Contains("Long");
Assert.IsTrue(result);
}
Und nur um sicher zu sein, dass die Deserialisierung mit, diese beiden Tests zu beginnen, funktioniert sowohl passieren.
[TestMethod]
public void IsApplied_When_LongIsDeserializedToTestObject()
{
string testData = "{\"Long\":1}";
var deserializedObject = JsonConvert.DeserializeObject<TestObjWithLong>(testData);
var result = deserializedObject.Long == 1;
Assert.IsTrue(result);
}
[TestMethod]
public void IsApplied_When_IntIsDeserializedToTestObject()
{
string testData = "{\"Int\":1}";
var deserializedObject = JsonConvert.DeserializeObject<TestObjWithInt>(testData);
var result = deserializedObject.Int == 1;
Assert.IsTrue(result);
}
fand ich this Bericht OData Fehler, wie ein ähnliches Problem klingt, aber seine alten und geschlossen, so wahrscheinlich nicht.
Jede Hilfe wäre großartig.
Mit Aussagen (von oben der Testdatei):
using System;
using System.Linq;
using System.Web.Http.OData;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Newtonsoft.Json;
Lösung, wenn sie von James Newton-King akzeptierte - Änderung 6.0.6 zu veröffentlichen. ersetzen JsonSerializerInternalReader.cs Linie 1581:
contract.TrySetMember(newObject, memberName, value);
mit:
bool done = false;
while (!(done = done || contract.TrySetMember(newObject, memberName, value)))
{
switch (reader.TokenType)
{
case JsonToken.Integer:
if (value is long && ((long)value) <= Int32.MaxValue && ((long)value) >= Int32.MinValue)
value = Convert.ToInt32(value);
//Add else if (...) to cast to other data types here (none additional required to date).
else
done = true;
break;
default:
done = true;
break;
}
}
Falls es jemand hilft, gibt es einen Thread mit einer sehr ähnlichen Frage, wo ich habe eine einfachere, ‚hacken‘ fix. [Hier ist die Antwort.] (Http://StackOverflow.com/a/41749206/2283050) –