我试图在dotnetrdf的帮助下解析RDF / JSON图形,当我将日期作为文字时失败,下面是一些带有问题的三元组的示例代码导致问题。
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());
导致以下执行:
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)
如果我删除显式数据类型,问题是一样的。但是,如果我改变文字,问题就会消失,因此根据ISO8601它不再是一个组合的日期和时间表达式。例如。只有日期有效。 这感觉就像一个错误,还是一个配置问题?
我的包裹参考是:
<PackageReference Include="dotnetrdf" Version="1.0.12" />
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" />
<PackageReference Include="VDS.Common" Version="1.8.0" />
我的猜测是底层的JSON解析器(Newtonsoft)试图变得聪明并且检测到字符串是可以转换为日期对象的东西。由于我是c#的初学者,我的调试技巧有些不稳定,所以我一直在猜测。
任何形式的指导都将受到高度赞赏。
答案 0 :(得分:0)
您的分析是正确的 - Newtonsoft解析器有助于将ISO日期格式转换为Date对象。可以禁用Newtonsoft解析器的功能,我们的RdfJsonParser可能应该禁用它,因为我们不希望将字符串转换为Date对象。
不幸的是,我不认为您可以通过代码执行此操作 - 这是dotNetRDF本身所需的修复方法。我在dotNetRDF问题跟踪器上将其记录为issue #130。
编辑:现在应该在2.0.0-pre0009
中修复