2015-04-14 1 views
8

Scope:Ist es möglich, ein "ISODate" -Feld von MongoDB zu einem JToken (C#) zu deserialisieren?

Ich bin ein set of tools schreiben Menschen laufen gemeinsame Operationen auf ihre MongoDB Datenbanken zu helfen, und „Exportieren“ Daten einer von ihnen ist.

Momentan unterstütze ich vollen JSON-Export und "CSV", aber letzteres ist viel komplizierter.

Das Export-Tool ermöglicht eine "ConfigFile", die angibt, welche Felder deserialisiert werden (von einem BsonDocument), kümmert sich nicht um ihren Typ. Die meisten Typen arbeiten gerade, aber "ISO" Termine bereiten mir immer noch Kopfzerbrechen.

Dynamische Deserialisierung

Derzeit verlasse ich mich auf JObjects das Parsen der "Json" Dokumente zu verarbeiten, wie folgt aus:

 // Json Writer Settings - To avoid problems with 10Gen types 
     var jsonSettings = new JsonWriterSettings() { OutputMode = JsonOutputMode.Strict }; 

     // Mapping string to a dynamic json object 
     JObject mappedJson = JObject.Parse (jsonObject.ToJson (jsonSettings)); 

     // Trying to extract property values out of the object 
     foreach (Field field in _configuration.Fields) 
     { 
       // Checking for JToken Type 
       JTokenType objType = fieldData.Type; 

       // Sanity Check for NULL Values of properties that do exist 
       if (objType == JTokenType.Null) 
       { 
        fieldValue = String.Empty; 
       } 
       else if (objType == JTokenType.Array) // Checking for Arrays (that need to be serialized differently) 
       { 
        String[] valuesArray = fieldData.Select (t => t.Value<String>().Replace (_configuration.ListDelimiter, String.Empty) 
                        .Replace (_configuration.Delimiter, String.Empty)).ToArray(); 

        fieldValue = String.Join (_configuration.ListDelimiter, valuesArray); 
       } 
       else if (objType == JTokenType.Object && field.Name.Equals ("_id")) // Checking for specific MongoDB "_id" situation 
       { 
        fieldValue = fieldData.ToObject<String>(); // Value<ObjectId>().ToString(); 
       } 
       else 
       { 
        // Reaching Attribute Value as "String" (if nothing else worked) 
        fieldValue = fieldData.Value<String>(); 
       } 
     } 

Das Problem:

Diese Code funktioniert für alle Typen, die ich bisher getestet habe, aber "DateTime". Die Art, wie MongoDB speichert, lautet wie folgt: "PublicationDate" : ISODate("2014-08-10T00:00:00.000Z"), was meine Deserialisierung komplett unterbricht.

Ich habe versucht, es als "DateTime" und als "Objekt" zu deserialisieren, aber beide funktionieren nicht. Gibt es einen geeigneten Weg, dies zu tun? Dies ist im Grunde alles, was mir fehlt, damit dieser "Dynamische Exporter" funktioniert.

Vielen Dank im Voraus

+0

Da Ihre Tools die JSON-Ausgabe steuern, sollten Sie Daten in JSON in einem Standardformat exportieren können. Sehen Sie hier für, wie man das macht: http://StackOverflow.com/Questions/21466446/Handling-Mongodbs-isodate-when-attempting-to-parse-a-serialized-json-string – dbc

+0

Der Ausdruck ISODate ("2014-08 -10T00: 00: 00.000Z ") ist in Json nicht gültig. Sie können die JSON-Definition unter http://www.json.org/ einsehen. Json.Net unterstützt einige Erweiterungen wie Kommentare, aber Daten sind NICHT in der JSON-Definition. Haben Sie ein vollständiges Beispiel für den Json, den Sie mit Json.NET analysieren wollen? –

Antwort

0

try catch eine Lösung in einem schlechten Weg zu fangen Datetime-iso sein kann? Wie JTokenType.Date.