// This code implements the San Antonio timeframe DSTU2 Json serialization of extensions // (using full urls as property names). This has been retracted, but keep the code here // in case we change our mind again. //private void rewriteExtensionProperties(JToken current, bool nested=false) //{ // if (current is JObject) // rewriteExtensionProperties((JObject)current, nested); // else if (current is JArray) // rewriteExtensionProperties((JArray)current, nested); //} //private bool isExtensionProperty(string name, bool nested) //{ // if(name.StartsWith("http://") || name.StartsWith("urn:")) return true; // if (!nested) // return false; // else // return name != "url" && name != "id" && !name.StartsWith("value"); //} //private void rewriteExtensionProperties(JObject current, bool nested=false) //{ // var extensionMembers = new List<JProperty>(); // var modifierExtensionMembers = new List<JProperty>(); // foreach (var property in current.Properties()) // { // if (isExtensionProperty(property.Name,nested)) // { // if(!(property.Value is JArray)) // throw Error.Format("Found extension '{0}', but its value is not an array", this, property.Name); // extensionMembers.Add(property); // } // else if (property.Name == "modifier") // { // if (nested) throw Error.Format("'modifier' cannot be used within an extension", this); // if (!(property.Value is JObject)) throw Error.Format("A 'modifier' property should contain a json object", this); // var modifiers = (JObject)property.Value; // foreach (var modifier in modifiers.Properties()) // { // if (!isExtensionProperty(modifier.Name, nested: false)) throw Error.Format("All properties within 'modifier' should have a url as its name", this); // modifierExtensionMembers.Add(modifier); // } // } // else // { // // not an extension property, so this is an actual element, and introduces a new scope // // for extensions...we're no longer looking for nested extension names // rewriteExtensionProperties(property.Value, nested: false); // } // } // if(extensionMembers.Any()) // { // foreach (var prop in extensionMembers) { current.Remove(prop.Name); }; // List<>.Foreach not in PCL (http://cureos.blogspot.com.au/2014/05/pcl-tips-and-tricks-listforeach.html) // var extProp = convertToExtensionProperty("extension",extensionMembers); // current.Add(extProp); // rewriteExtensionProperties(extProp.Value, nested:true); // The Extension.value[x] themselves might contain data that has extension, so recurse // } // if(modifierExtensionMembers.Any()) // { // current.Remove("modifier"); // var mextProp = convertToExtensionProperty("modifierExtension", modifierExtensionMembers); // current.Add(mextProp); // rewriteExtensionProperties(mextProp.Value, nested:true); // The Extension.value[x] themselves might contain data that has extension, so recurse // } //} //private JProperty convertToExtensionProperty(string name, List<JProperty> extensionMembers) //{ // var extArray = new JArray(); // var extProperty = new JProperty(name, extArray); // foreach (var ext in extensionMembers) // { // var extensionObjectArray = (JArray)ext.Value; // foreach (var extensionObject in extensionObjectArray) // { // if (!(extensionObject is JObject)) // throw Error.Format("Extension '{0}' contains an array element that is not a complex object", this, ext.Name); // var extensionJObject = (JObject)extensionObject; // extensionJObject.Add(new JProperty("url", ext.Name)); // extArray.Add(extensionJObject); // } // } // return extProperty; //} //private void rewriteExtensionProperties(JArray current, bool nested=false) //{ // foreach (var element in current.Children()) // rewriteExtensionProperties(element,nested); //} public object GetPrimitiveValue() { if (_current is JValue) { return(((JValue)_current).Value); } else if (_current is JObject) { // Hack: primitives have been expanded to objects by the JsonTreeRewriter, so if this is the case, just get the "value" property var cplx = _current as JObject; JToken value = null; if (cplx.TryGetValue(JsonTreeRewriter.PRIMITIVE_PROP_NAME, out value)) { var nestedReader = new JsonDomFhirReader(value); return(nestedReader.GetPrimitiveValue()); } else { throw Error.Format("Tried to read a primitive value while reader is at a complex object", this); } } else { throw Error.Format("Tried to read a primitive value while reader is not at a json primitive", this); } }
public IEnumerable <Tuple <string, IFhirReader> > GetMembers() { var complex = _current as JObject; if (complex == null) { throw Error.Format("Need to be at a complex object to list child members", this); } var members = JsonTreeRewriter.ExpandComplexObject(complex); foreach (var member in members) { var memberName = member.Name; //When enumerating properties for a complex object, make sure not to let resourceType get through if (memberName != JsonDomFhirReader.RESOURCETYPE_MEMBER_NAME) { IFhirReader nestedReader = new JsonDomFhirReader(member.Value); // Remove [nn] appendix that was there to allow a JObject have repeating members // with the same name var pos = memberName.IndexOf('['); if (pos > 0) { memberName = memberName.Substring(0, pos); } yield return(Tuple.Create(memberName, nestedReader)); } } }
//When enumerating properties for a complex object, make sure not to let resourceType get through //TODO: Detecting whether this is a special, serialization format-specific member should be //done in an abstraction around the json or xml readers. public IEnumerable <Tuple <string, IFhirReader> > GetMembers() { var complex = _current as JObject; if (complex == null) { throw Error.Format("Need to be at a complex object to list child members", this); } foreach (var member in complex) { var memberName = member.Key; if (memberName != JsonDomFhirReader.RESOURCETYPE_MEMBER_NAME) { IFhirReader nestedReader = new JsonDomFhirReader(member.Value); // Map contents of _membername elements to the normal 'membername' // effectively treating this as if an objects properies are spread out // over two separate json objects if (memberName.StartsWith("_")) { memberName = memberName.Remove(0, 1); } yield return(Tuple.Create(memberName, nestedReader)); } } }
public IEnumerable <IFhirReader> GetArrayElements() { var array = _current as JArray; if (array == null) { throw Error.Format("Need to be at an array to list elements", JsonDomFhirReader.GetLineInfo(_current)); } foreach (var element in array) { yield return(new JsonDomFhirReader(element)); } }
//When enumerating properties for a complex object, make sure not to let resourceType get through //TODO: Detecting whether this is a special, serialization format-specific member should be //done in an abstraction around the json or xml readers. public IEnumerable<Tuple<string, IFhirReader>> GetMembers() { var complex = _current as JObject; if (complex == null) throw Error.Format("Need to be at a complex object to list child members", this); foreach(var member in complex) { var memberName = member.Key; if(memberName != JsonDomFhirReader.RESOURCETYPE_MEMBER_NAME) { IFhirReader nestedReader = new JsonDomFhirReader(member.Value); // Map contents of _membername elements to the normal 'membername' // effectively treating this as if an objects properies are spread out // over two separate json objects if (memberName.StartsWith("_")) memberName = memberName.Remove(0, 1); yield return Tuple.Create(memberName,nestedReader); } } }
// [WMR 20160421] Caller is responsible for disposing reader public Base Parse(JsonReader reader, Type dataType) { var jsonReader = new JsonDomFhirReader(reader); return(Parse(jsonReader, dataType)); }
private static IList <BundleEntry> loadEntries(JArray entries, Bundle parent) { var result = new List <BundleEntry>(); foreach (var entry in entries) { if (entry.Type != JTokenType.Object) { throw Error.Format("Expected a complex object when reading an entry", JsonDomFhirReader.GetLineInfo(entries)); } var loaded = loadEntry((JObject)entry); if (entry != null) { result.Add(loaded); } } return(result); }
public IEnumerable<Tuple<string, IFhirReader>> GetMembers() { var complex = _current as JObject; if (complex == null) throw Error.Format("Need to be at a complex object to list child members", this); var members = JsonTreeRewriter.ExpandComplexObject(complex); foreach(var member in members) { var memberName = member.Name; //When enumerating properties for a complex object, make sure not to let resourceType get through if(memberName != JsonDomFhirReader.RESOURCETYPE_MEMBER_NAME) { IFhirReader nestedReader = new JsonDomFhirReader(member.Value); // Remove [nn] appendix that was there to allow a JObject have repeating members // with the same name var pos = memberName.IndexOf('['); if (pos > 0) memberName = memberName.Substring(0, pos); yield return Tuple.Create(memberName,nestedReader); } } }
// This code implements the San Antonio timeframe DSTU2 Json serialization of extensions // (using full urls as property names). This has been retracted, but keep the code here // in case we change our mind again. //private void rewriteExtensionProperties(JToken current, bool nested=false) //{ // if (current is JObject) // rewriteExtensionProperties((JObject)current, nested); // else if (current is JArray) // rewriteExtensionProperties((JArray)current, nested); //} //private bool isExtensionProperty(string name, bool nested) //{ // if(name.StartsWith("http://") || name.StartsWith("urn:")) return true; // if (!nested) // return false; // else // return name != "url" && name != "id" && !name.StartsWith("value"); //} //private void rewriteExtensionProperties(JObject current, bool nested=false) //{ // var extensionMembers = new List<JProperty>(); // var modifierExtensionMembers = new List<JProperty>(); // foreach (var property in current.Properties()) // { // if (isExtensionProperty(property.Name,nested)) // { // if(!(property.Value is JArray)) // throw Error.Format("Found extension '{0}', but its value is not an array", this, property.Name); // extensionMembers.Add(property); // } // else if (property.Name == "modifier") // { // if (nested) throw Error.Format("'modifier' cannot be used within an extension", this); // if (!(property.Value is JObject)) throw Error.Format("A 'modifier' property should contain a json object", this); // var modifiers = (JObject)property.Value; // foreach (var modifier in modifiers.Properties()) // { // if (!isExtensionProperty(modifier.Name, nested: false)) throw Error.Format("All properties within 'modifier' should have a url as its name", this); // modifierExtensionMembers.Add(modifier); // } // } // else // { // // not an extension property, so this is an actual element, and introduces a new scope // // for extensions...we're no longer looking for nested extension names // rewriteExtensionProperties(property.Value, nested: false); // } // } // if(extensionMembers.Any()) // { // foreach (var prop in extensionMembers) { current.Remove(prop.Name); }; // List<>.Foreach not in PCL (http://cureos.blogspot.com.au/2014/05/pcl-tips-and-tricks-listforeach.html) // var extProp = convertToExtensionProperty("extension",extensionMembers); // current.Add(extProp); // rewriteExtensionProperties(extProp.Value, nested:true); // The Extension.value[x] themselves might contain data that has extension, so recurse // } // if(modifierExtensionMembers.Any()) // { // current.Remove("modifier"); // var mextProp = convertToExtensionProperty("modifierExtension", modifierExtensionMembers); // current.Add(mextProp); // rewriteExtensionProperties(mextProp.Value, nested:true); // The Extension.value[x] themselves might contain data that has extension, so recurse // } //} //private JProperty convertToExtensionProperty(string name, List<JProperty> extensionMembers) //{ // var extArray = new JArray(); // var extProperty = new JProperty(name, extArray); // foreach (var ext in extensionMembers) // { // var extensionObjectArray = (JArray)ext.Value; // foreach (var extensionObject in extensionObjectArray) // { // if (!(extensionObject is JObject)) // throw Error.Format("Extension '{0}' contains an array element that is not a complex object", this, ext.Name); // var extensionJObject = (JObject)extensionObject; // extensionJObject.Add(new JProperty("url", ext.Name)); // extArray.Add(extensionJObject); // } // } // return extProperty; //} //private void rewriteExtensionProperties(JArray current, bool nested=false) //{ // foreach (var element in current.Children()) // rewriteExtensionProperties(element,nested); //} public object GetPrimitiveValue() { if (_current is JValue) return ((JValue)_current).Value; else if(_current is JObject) { // Hack: primitives have been expanded to objects by the JsonTreeRewriter, so if this is the case, just get the "value" property var cplx = _current as JObject; JToken value = null; if (cplx.TryGetValue(JsonTreeRewriter.PRIMITIVE_PROP_NAME, out value)) { var nestedReader = new JsonDomFhirReader(value); return nestedReader.GetPrimitiveValue(); } else throw Error.Format("Tried to read a primitive value while reader is at a complex object", this); } else throw Error.Format("Tried to read a primitive value while reader is not at a json primitive", this); }