// 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));
                }
            }
        }
Esempio n. 3
0
        //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));
                }
            }
        }
Esempio n. 4
0
        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);
                }
            }
        }
Esempio n. 6
0
        // [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);
                }
            }
        }
Esempio n. 9
0
        // 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);
        }