JSON.NET-Cast-Fehler beim Serialisieren von Mongo ObjectId
Ich bin Herumspielen mit MongoDB und haben ein Objekt mit einer mongodb ObjectId.
Wenn ich serialise diese mit der .NET Json () - Methode, alles ist gut (aber die Termine sind schrecklich!)
Wenn ich versuche diese mit der JSON.NET serialiser es gibt mir eine InvalidCastException, wenn Sie versuchen zu serialise die ObjectID
irgendwelche Ideen, was ist passiert und wie kann ich dieses Problem beheben?
using MongoDB.Driver;
using MongoDB.Bson;
using Newtonsoft.Json;
//this is a route on a controller
public string NiceJsonPlease()
{
var q = new TestClass();
q.id = new ObjectId();
q.test = "just updating this";
return JsonConvert.SerializeObject(q);
}
//simple test class
class TestClass
{
public ObjectId id; //MongoDB ObjectID
public string test = "hi there";
}
Exception Details: System.InvalidCastException: Specified cast is not valid.
Wenn Sie ändern Sie die controller-Methode zu verwenden, die serialisierungskomponente, die Schiffe mit .NET, funktioniert es (aber das gibt hässliche Termine, blugh)
public JsonResult NiceJsonPlease()
{
var q = new TestClass();
q.id = new ObjectId();
q.test = "just updating this";
return Json(q, JsonRequestBehavior.AllowGet);
}
Kommentar zu dem Problem
ah, die alte Json-Daten Ausgabe: hanselman.com/blog/...
@Liam Hallo Liam, habe ich eigentlich gelesen, dass der blog heute früher und ist sozusagen der Grund, ich bin diese Frage zu stellen. JSON.NET gibt mir das schönere Datum, aber wenn ich die MongoDB ObjectID in meinem Modell und versuchen, es zu serialisieren mit JSON.NET es Fehler.
Können Sie zeigen Sie Ihren code?
Ich hatte ähnliches problem beim verwenden atribute [BsonDefaultValue(0)] über Eigentum und Nutzung ProjectionDefinition, um Daten form MongoDB [BsonDefaultValue(0)] public long SomePropery; Lösung entfernen atribute.
InformationsquelleAutor der Frage Keeno | 2013-05-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Sie verwenden können .NET string-Typ anstelle von ObjectId, die Sie gerade brauchen, um es zu schmücken, mit BsonRepresentation. Wenn Sie BsonDateTime, Sie haben die gleiche Konvertierung Problem. Dies ist eine domain-Klasse in meinem Projekt, setzt die Dekoratoren.
InformationsquelleAutor der Antwort Andy
Hatte ich einen Zeiger von der MongoDB user-Gruppe.
https://groups.google.com/forum/?fromgroups=#!Thema/mongodb-csharp/A_DXHuPscnQ
War die Antwort
"Dies scheint eine Json.NET Thema, aber nicht wirklich. Es gibt einen benutzerdefinierten Typ hier es einfach nicht kennen. Sie müssen sagen Json.NET serialisieren einer ObjectId."
So, ich implementiert die folgende Lösung
Ich dekorierte mein ObjectId mit
Schrieb dann einen eigenen Wandler, nur spuckt die Guid Teil der ObjectId
InformationsquelleAutor der Antwort Keeno
1) Schreiben ObjectId Konverter
2) Registrieren Sie es in JSON.NET weltweit mit globalen Einstellungen und die Sie nicht benötigen, markieren Sie Modelle mit großen Attribute
InformationsquelleAutor der Antwort ZOXEXIVO
Ich beschloss, dass ich ein ähnliches problem, das ich erlebte mit der JSON.NET serializer/InvalidCastException-Fehler durch einstellen der JsonOutputMode strenge, die beseitigt die Notwendigkeit der Veränderung der zugrunde liegende Typ:
Mit weiteren Informationen zur Verfügung, die in der API: http://api.mongodb.org/csharp/1.8.3/html/d73bf108-d68c-e472-81af-36ac29ea08da.htm
InformationsquelleAutor der Antwort lintunen
Ich lief in ein ähnliches problem mit einer Web-API-Projekt, und die Wunde schlägt meinen Kopf gegen die Tastatur für ein paar Stunden, bevor ich diesen thread gefunden.
Zunächst hat alles gut funktioniert, aber dann lief ich in das problem nach der Umstellung mein code, um meine eigenen benutzerdefinierten Klasse, anstatt die BsonDocument Objekt, wie empfohlen, in der mongoDB C# driver Dokumentation.
http://docs.mongodb.org/ecosystem/tutorial/getting-started-with-csharp-driver/#bsondocument-object-model-vs-your-own-domain-classes
Hier VB.net entspricht die Lösung oben für diejenigen, die es brauchen;
InformationsquelleAutor der Antwort Drifter
Verwendete ich diesen code VB.Net und er funktioniert perfekt, Sie können sehen, die Objektkennung in der Klasse, und Sie können tun die gleiche Sache mit dem DATE-Datentyp.
InformationsquelleAutor der Antwort Diego