2017-10-31 26 views
1

Ich versuche, ein RDF/JSON-Diagramm mit Hilfe von dotnetrdf zu analysieren und es schlägt fehl, wenn ich ein Datum als Literal habe, unten ist ein Beispielcode mit dem problematischen Tripel, das das Problem verursacht .Triple mit ISO8601 Datum bricht RDFJSON Parser in Dotnetrdf

using VDS.RDF; 
using VDS.RDF.Parsing; 
... 
var jsonstr = @" 
{ 
    ""http://example.com"": { 
    ""http://purl.org/dc/terms/issued"": [{ 
     ""datatype"": ""http://www.w3.org/2001/XMLSchema#date"", 
     ""type"": ""literal"", 
     ""value"": ""2017-10-24T15:01:53+02:00"" 
     }] 
    } 
    }"; 

    IGraph g = new Graph(); 
    g.LoadFromString(str1, new RdfJsonParser()); 

verursacht die folgende execption:

Exception has occurred: CLR/VDS.RDF.Parsing.RdfParseException 
Exception thrown: 'VDS.RDF.Parsing.RdfParseException' in dotNetRDF.dll: '[Line 4 Column 40 to Line 7 Column 44] Unexpected Token 'Date' encountered, expected a Property Value describing one of the properties of an Object Node' 
    at VDS.RDF.Parsing.RdfJsonParser.Error(JsonParserContext context, String message, PositionInfo startPos) 
    at VDS.RDF.Parsing.RdfJsonParser.ParseObject(JsonParserContext context, INode subj, INode pred) 
    at VDS.RDF.Parsing.RdfJsonParser.ParseObjectList(JsonParserContext context, INode subj, INode pred) 
    at VDS.RDF.Parsing.RdfJsonParser.ParsePredicateObjectList(JsonParserContext context, INode subj) 
    at VDS.RDF.Parsing.RdfJsonParser.ParseTriples(JsonParserContext context) 
    at VDS.RDF.Parsing.RdfJsonParser.ParseGraphObject(JsonParserContext context) 
    at VDS.RDF.Parsing.RdfJsonParser.Parse(IRdfHandler handler, TextReader input) 
    at VDS.RDF.Parsing.RdfJsonParser.Load(IRdfHandler handler, TextReader input) 
    at VDS.RDF.Parsing.StringParser.Parse(IGraph g, String data, IRdfReader reader) 

Das Problem ist das gleiche, wenn ich den expliziten Datentyp entfernen. Aber das Problem dissapers, wenn ich das Literal ändere, so ist es nicht mehr ein kombinierter Ausdruck für Datum und Uhrzeit nach ISO8601. Z.B. nur das Datum funktioniert. Das fühlt sich an wie ein Fehler oder ist es ein Konfigurationsproblem?

Mein Paket Referenzen sind:

<PackageReference Include="dotnetrdf" Version="1.0.12" /> 
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" /> 
<PackageReference Include="VDS.Common" Version="1.8.0" /> 

Meine Vermutung ist, dass der zugrunde liegende JSON-Parser (Newtonsoft) intelligent zu sein versucht und erkennt die Zeichenfolge etwas zu sein, es in ein Date-Objekt übersetzen. Da ich ein Anfänger in C# bin, sind meine Debugging-Fähigkeiten etwas wackelig, so dass ich beim Raten feststecke.

Jede Art von Anleitung wird sehr geschätzt.

+0

Json.Net nicht "versuchen, smart zu sein". Das ist das erwartete Verhalten. .NET-Entwickler würden sich auflehnen, wenn es nicht so funktioniert. Wenn Sie ein Feld nicht analysieren möchten, können Sie es anweisen, das Feld als Zeichenfolge zu lesen, ein Attribut für die Zielklasse zu verwenden oder [die Standardeinstellungen für die Serialisierung zu ändern] (https://www.newtonsoft.com/ json/help/html/DefaultSettings.htm) und setzen [JsonSerializerSettings.DateParseHandling] (https://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_JsonSerializerSettings_DateParseHandling.htm) auf [Keine] (https: //www.newtonsoft .com/json/help/html/T_Newtonsoft_Json_DateParseHandling.htm) –

Antwort

0

Ihre Analyse ist korrekt - der Newtonsoft-Parser konvertiert das ISO-Datumsformat hilfreich in ein Date-Objekt. Es ist die Funktionalität des Newtonsoft-Parsers, die deaktiviert werden kann, und unser RdfJsonParser sollte sie wahrscheinlich deaktivieren, weil wir nicht möchten, dass die Zeichenfolge in ein Date-Objekt konvertiert wird.

Leider glaube ich nicht, dass es einen Weg gibt, den Sie aus Ihrem Code machen können - es ist ein Fix, der in dotNetRDF selbst benötigt wird. Ich habe dies als issue #130 auf dem dotNetRDF Issue Tracker protokolliert.

Edit: Dies sollte jetzt in 2.0.0-pre0009 behoben werden

+0

Sieht so aus, als müsste man 'DateParseHandling = DateParseHandling.None' in den Konstruktoren von CommentIgnoringJsonTextReader setzen? Es scheint keinen Weg zu geben, einen konfigurierten Leser oder irgendeine andere Einstellung in "RdfJsonParser" zu injizieren –

Verwandte Themen