/// <summary>parses a @context object and sets any namespaces found within it</summary> /// <param name="context"></param> public virtual void ParseContext(JObject context) { foreach (string key in context.GetKeys()) { JToken val = context[key]; if ("@vocab".Equals(key)) { if (val.IsNull() || JsonLdUtils.IsString(val)) { SetNamespace(string.Empty, (string)val); } } else { // TODO: the context is actually invalid, should we throw an // exception? if ("@context".Equals(key)) { // go deeper! ParseContext((JObject)context["@context"]); } else { if (!JsonLdUtils.IsKeyword(key)) { // TODO: should we make sure val is a valid URI prefix (i.e. it // ends with /# or ?) // or is it ok that full URIs for terms are used? if (val.Type == JTokenType.String) { SetNamespace(key, (string)context[key]); } else { if (JsonLdUtils.IsObject(val) && ((JObject)val).ContainsKey("@id" )) { SetNamespace(key, (string)((JObject)val)["@id"]); } } } } } } }
/// <summary>parses a @context object and sets any namespaces found within it</summary> /// <param name="context"></param> public virtual void ParseContext(JObject context) { foreach (var key in context.GetKeys()) { var val = context[key]; if ("@vocab".Equals(key)) { if (val.IsNull() || JsonLdUtils.IsString(val)) { SetNamespace(string.Empty, (string)val); } } else { // TODO: the context is actually invalid, should we throw an // exception? if ("@context".Equals(key)) { // go deeper! ParseContext((JObject)context["@context"]); } else { if (!JsonLdUtils.IsKeyword(key)) { if (val.Type == JTokenType.String) { SetNamespace(key, (string)context[key]); } else { if (JsonLdUtils.IsObject(val) && ((JObject)val).ContainsKey("@id" )) { SetNamespace(key, (string)((JObject)val)["@id"]); } } } } } } }
/// <summary> /// Converts a JSON-LD value object to an RDF literal or a JSON-LD string or /// node object to an RDF resource. /// </summary> /// <remarks> /// Converts a JSON-LD value object to an RDF literal or a JSON-LD string or /// node object to an RDF resource. /// </remarks> /// <param name="item">the JSON-LD value or node object.</param> /// <param name="namer">the UniqueNamer to use to assign blank node names.</param> /// <returns>the RDF literal or RDF resource.</returns> private static JObject ObjectToRDF(JToken item, UniqueNamer namer) { JObject @object = new JObject(); // convert value object to RDF if (JsonLdUtils.IsValue(item)) { @object["type"] = "literal"; JToken value = ((JObject)item)["@value"]; JToken datatype = ((JObject)item)["@type"]; // convert to XSD datatypes as appropriate if (value.Type == JTokenType.Boolean || value.Type == JTokenType.Float || value.Type == JTokenType.Integer) { // convert to XSD datatype if (value.Type == JTokenType.Boolean) { @object["value"] = value.ToString(); @object["datatype"] = datatype.IsNull() ? JSONLDConsts.XsdBoolean : datatype; } else { if (value.Type == JTokenType.Float) { // canonical double representation @object["value"] = string.Format("{0:0.0###############E0}", (double)value); @object["datatype"] = datatype.IsNull() ? JSONLDConsts.XsdDouble : datatype; } else { DecimalFormat df = new DecimalFormat("0"); @object["value"] = df.Format((int)value); @object["datatype"] = datatype.IsNull() ? JSONLDConsts.XsdInteger : datatype; } } } else { if (((IDictionary <string, JToken>)item).ContainsKey("@language")) { @object["value"] = value; @object["datatype"] = datatype.IsNull() ? JSONLDConsts.RdfLangstring : datatype; @object["language"] = ((IDictionary <string, JToken>)item)["@language"]; } else { @object["value"] = value; @object["datatype"] = datatype.IsNull() ? JSONLDConsts.XsdString : datatype; } } } else { // convert string/node object to RDF string id = JsonLdUtils.IsObject(item) ? (string)((JObject)item )["@id"] : (string)item; if (id.IndexOf("_:") == 0) { @object["type"] = "blank node"; @object["value"] = namer.GetName(id); } else { @object["type"] = "IRI"; @object["value"] = id; } } return(@object); }
/// <summary> /// Converts a JSON-LD value object to an RDF literal or a JSON-LD string or /// node object to an RDF resource. /// </summary> /// <remarks> /// Converts a JSON-LD value object to an RDF literal or a JSON-LD string or /// node object to an RDF resource. /// </remarks> /// <param name="item">the JSON-LD value or node object.</param> /// <param name="namer">the UniqueNamer to use to assign blank node names.</param> /// <returns>the RDF literal or RDF resource.</returns> private RDFDataset.Node ObjectToRDF(JToken item) { // convert value object to RDF if (JsonLdUtils.IsValue(item)) { JToken value = ((JObject)item)["@value"]; JToken datatype = ((JObject)item)["@type"]; // convert to XSD datatypes as appropriate if (value.Type == JTokenType.Boolean || value.Type == JTokenType.Float || value.Type == JTokenType.Integer) { // convert to XSD datatype if (value.Type == JTokenType.Boolean) { var serializeObject = JsonConvert.SerializeObject(value, Formatting.None).Trim('"'); return(new RDFDataset.Literal(serializeObject, datatype.IsNull() ? JSONLDConsts.XsdBoolean : (string)datatype, null)); } else { if (value.Type == JTokenType.Float || datatype.SafeCompare(JSONLDConsts.XsdDouble)) { // Workaround for Newtonsoft.Json's refusal to cast a JTokenType.Integer to a double. if (value.Type == JTokenType.Integer) { int number = (int)value; value = new JValue((double)number); } // canonical double representation return(new RDFDataset.Literal(string.Format(CultureInfo.InvariantCulture, "{0:0.0###############E0}", (double)value), datatype.IsNull() ? JSONLDConsts.XsdDouble : (string)datatype, null)); } else { return(new RDFDataset.Literal(string.Format("{0:0}", value), datatype.IsNull() ? JSONLDConsts.XsdInteger : (string)datatype, null)); } } } else { if (((JObject)item).ContainsKey("@language")) { return(new RDFDataset.Literal((string)value, datatype.IsNull() ? JSONLDConsts.RdfLangstring : (string)datatype, (string)((JObject)item)["@language"])); } else { var serializeObject = JsonConvert.SerializeObject(value, Formatting.None).Trim('"'); return(new RDFDataset.Literal(serializeObject, datatype.IsNull() ? JSONLDConsts.XsdString : (string)datatype, null)); } } } else { // convert string/node object to RDF string id; if (JsonLdUtils.IsObject(item)) { id = (string)((JObject)item)["@id"]; if (JsonLdUtils.IsRelativeIri(id)) { return(null); } } else { id = (string)item; } if (id.IndexOf("_:") == 0) { // NOTE: once again no need to rename existing blank nodes return(new RDFDataset.BlankNode(id)); } else { return(new RDFDataset.IRI(id)); } } }
/// <summary> /// Converts a JSON-LD value object to an RDF literal or a JSON-LD string or /// node object to an RDF resource. /// </summary> /// <remarks> /// Converts a JSON-LD value object to an RDF literal or a JSON-LD string or /// node object to an RDF resource. /// </remarks> /// <param name="item">the JSON-LD value or node object.</param> /// <param name="namer">the UniqueNamer to use to assign blank node names.</param> /// <returns>the RDF literal or RDF resource.</returns> private RDFDataset.Node ObjectToRDF(JToken item) { // convert value object to RDF if (JsonLdUtils.IsValue(item)) { JToken value = ((JObject)item)["@value"]; JToken datatype = ((JObject)item)["@type"]; // convert to XSD datatypes as appropriate if (value.Type == JTokenType.Boolean || value.Type == JTokenType.Float || value.Type == JTokenType.Integer) { // convert to XSD datatype if (value.Type == JTokenType.Boolean) { return(new RDFDataset.Literal(value.ToString(), datatype.IsNull() ? JSONLDConsts.XsdBoolean : (string)datatype, null)); } else { if (value.Type == JTokenType.Float || datatype.SafeCompare(JSONLDConsts.XsdDouble)) { // canonical double representation return(new RDFDataset.Literal(string.Format("{0:0.0###############E0}", value), datatype.IsNull() ? JSONLDConsts.XsdDouble : (string)datatype, null)); } else { return(new RDFDataset.Literal(string.Format("{0:0}", value), datatype.IsNull() ? JSONLDConsts.XsdInteger : (string)datatype, null)); } } } else { if (((JObject)item).ContainsKey("@language")) { return(new RDFDataset.Literal((string)value, datatype.IsNull() ? JSONLDConsts.RdfLangstring : (string)datatype, (string)((JObject)item)["@language"])); } else { return(new RDFDataset.Literal((string)value, datatype.IsNull() ? JSONLDConsts.XsdString : (string)datatype, null)); } } } else { // convert string/node object to RDF string id; if (JsonLdUtils.IsObject(item)) { id = (string)((JObject)item)["@id"]; if (JsonLdUtils.IsRelativeIri(id)) { return(null); } } else { id = (string)item; } if (id.IndexOf("_:") == 0) { // NOTE: once again no need to rename existing blank nodes return(new RDFDataset.BlankNode(id)); } else { return(new RDFDataset.IRI(id)); } } }