private static void AssertInStock(Type expected, Type type)
 {
     ImportContext context = new ImportContext();
     IImporter importer = context.FindImporter(type);
     Assert.IsNotNull(importer, "No importer found for {0}", type.FullName);
     Assert.IsInstanceOfType(expected, importer, type.FullName);
 }
Example #2
0
        public ObjectConstructionResult CreateObject(ImportContext context, JsonReader reader)
        {
            if (context == null) throw new ArgumentNullException("context");
            if (reader == null) throw new ArgumentNullException("reader");

            return CreateObject(context, JsonBuffer.From(reader).GetMembersArray());
        }
Example #3
0
        protected override object ImportFromString(ImportContext context, JsonReader reader)
        {
            Debug.Assert(context != null);
            Debug.Assert(reader != null);

            string s = reader.Text.Trim();

            if (s.Length > 0)
            {
                char ch = s[0];

                if (Char.IsDigit(ch) || ch == '+' || ch == '-')
                    throw Error(s, null);
            }

            try
            {
                return ReadReturning(reader, Enum.Parse(OutputType, s, true));
            }
            catch (ArgumentException e)
            {
                //
                // Value is either an empty string ("") or only contains
                // white space. Value is a name, but not one of the named
                // constants defined for the enumeration.
                //

                throw Error(s, e);
            }
        }
Example #4
0
 public void Registration()
 {
     ImportContext context = new ImportContext();
     ThingImporter importer = new ThingImporter();
     context.Register(importer);
     Assert.AreSame(importer, context.FindImporter(typeof(Thing)));
 }
Example #5
0
 public void RegistrationIsPerContext()
 {
     ImportContext context = new ImportContext();
     ThingImporter exporter = new ThingImporter();
     context.Register(exporter);
     context = new ImportContext();
     Assert.AreNotSame(exporter, context.FindImporter(typeof(Thing)));
 }
 public object Import(ImportContext context, Jayrock.Json.JsonReader reader)
 {
     ActiveReaderMessage arMessage = null;
       Dispatcher.Invoke(DispatcherPriority.Background,
     (Action)delegate()
     {
       arMessage = (ActiveReaderMessage)context.Import<ActiveReaderMessage>(reader); ;
     });
       return arMessage;
 }
Example #7
0
        private TransportComponent()
        {
            JsonExportContext = JsonConvert.CreateExportContext();
              JsonExportContext.Register(new TransportMessageExporter());

              JsonImportContext = JsonConvert.CreateImportContext();
              JsonImportContext.Register(new TransportMessageImporter());

              TransportListeners.Add(this);
        }
        public virtual ObjectConstructionResult CreateObject(ImportContext context, JsonReader reader)
        {
            if (context == null) 
                throw new ArgumentNullException("context");
            if (reader == null) 
                throw new ArgumentNullException("reader");

            IObjectSurrogateConstructor ctor = (IObjectSurrogateConstructor) context.Import(_surrogateType, reader);
            return ctor.CreateObject(context);
        }
        /// <summary>
        /// The import.
        /// </summary>
        /// <param name="context">
        /// The context.
        /// </param>
        /// <param name="reader">
        /// The reader.
        /// </param>
        /// <returns>
        /// The import.
        /// </returns>
        public object Import(ImportContext context, JsonReader reader)
        {
            // var properties = new EvolutionaryProperties();
            // reader.StepOut();
            // JsonToken token = reader.Token;
            this.properties = new EvolutionaryProperties();

            PropertyValue[] o = context.Import<PropertyValue[]>(reader);
            this.SetProperties(o);

            return this.properties;
        }
        public virtual ObjectConstructionResult CreateObject(ImportContext context)
        {
            if (context == null) throw new ArgumentNullException("context");

            JsonBufferWriter tailw = _tailw;
            _tailw = null;
            if (tailw != null)
                tailw.WriteEndObject();
            JsonBuffer tail = (tailw != null ? tailw.GetBuffer() : StockJsonBuffers.EmptyObject);
            object obj = OnCreateObject(context);
            return new ObjectConstructionResult(obj, tail.CreateReader());
        }
Example #11
0
 protected override object ImportFromString(Jayrock.Json.Conversion.ImportContext context, JsonReader reader)
 {
     try
     {
         string val = reader.ReadString();
         return(DateTime.Parse(val));
     }
     catch (FormatException e)
     {
         throw new JsonException("Error importing JSON String as System.DateTime.", e);
     }
 }
Example #12
0
 protected override object ImportFromString(Jayrock.Json.Conversion.ImportContext context, JsonReader reader)
 {
     try
     {
         string val = reader.ReadString().ToLower();
         return((val == "1") || (val == "true") || (val == "t"));
     }
     catch (FormatException e)
     {
         throw new JsonException("Error importing JSON String as System.Boolean.", e);
     }
 }
Example #13
0
        private object ReflectImport(ImportContext context, JsonReader reader)
        {
            if (context == null)
                throw new ArgumentNullException("context");

            if (reader == null)
                throw new ArgumentNullException("reader");

            IJsonImportable o = CreateObject();
            o.Import(context, reader);
            return o;
        }
Example #14
0
 protected override object ImportFromString(Jayrock.Json.Conversion.ImportContext context, JsonReader reader)
 {
     try
     {
         string        val    = reader.ReadString();
         EmailAdresses result = new EmailAdresses();
         result.Adresses = JsonConvert.Import <string[]>(val);
         return(result);
     }
     catch (FormatException e)
     {
         throw new JsonException("Error importing JSON String as " + this.OutputType.FullName + ".", e);
     }
 }
Example #15
0
        protected override object ImportFromArray(ImportContext context, JsonReader reader)
        {
            Debug.Assert(context != null);
            Debug.Assert(reader != null);

            reader.Read();

            ArrayList list = new ArrayList();
            Type elementType = OutputType.GetElementType();

            while (reader.TokenClass != JsonTokenClass.EndArray)
                list.Add(context.Import(elementType, reader));

            return ReadReturning(reader, list.ToArray(elementType));
        }
        public virtual bool Import(ImportContext context, string name, JsonReader reader)
        {
            if (context == null) throw new ArgumentNullException("context");
            if (reader == null) throw new ArgumentNullException("reader");

            JsonBufferWriter tailw = _tailw;
            if (tailw == null)
            {
                tailw = _tailw = new JsonBufferWriter();
                tailw.WriteStartObject();
            }
            tailw.WriteMember(name);
            tailw.WriteFromReader(reader);
            return true;
        }
        protected override void ImportElements(object collection, ImportContext context, JsonReader reader)
        {
            if (collection == null) throw new ArgumentNullException("collection");
            if (context == null) throw new ArgumentNullException("context");
            if (reader == null) throw new ArgumentNullException("reader");

            object[] args = null;
            while (reader.TokenClass != JsonTokenClass.EndArray)
            {
                if (args == null)           // on-demand
                    args = new object[1];

                args[0] = context.Import(ElementType, reader);
                InvokeAdd(collection, args);
            }
        }
        protected override object ImportFromArray(ImportContext context, JsonReader reader)
        {
            if (context == null) throw new ArgumentNullException("context");
            if (reader == null) throw new ArgumentNullException("reader");

            object collection = CreateCollection();

            reader.ReadToken(JsonTokenClass.Array);

            ImportElements(collection, context, reader);

            if (reader.TokenClass != JsonTokenClass.EndArray)
                throw new Exception("Implementation error.");

            reader.Read();
            return collection;
        }
Example #19
0
        public JsonRpcDispatchScope(JsonRpcDispatcher dispatcher, HttpContext context) 
        {
            Debug.Assert(dispatcher != null);
            Debug.Assert(context != null);

            //
            // Setup for local execution if client request is from the same
            // machine. The dispatcher uses this to determine whether to 
            // emit a detailed stack trace or not in the event of an error.
            //

            if (HttpRequestSecurity.IsLocal(context.Request))
                dispatcher.LocalExecution = true;

            //
            // Initialize the import and export contexts, which are pooled
            // per-application instance.
            //

            IDictionary appVars = AppVars.Get(context.ApplicationInstance);

            ExportContext expctx = (ExportContext) appVars[typeof(ExportContext)];

            if (expctx == null)
            {
                expctx = JsonConvert.CreateExportContext();
                appVars.Add(typeof(ExportContext), expctx);
            }
            
            dispatcher.JsonExporter = new JsonExportHandler(expctx.Export);

            ImportContext impctx = (ImportContext) appVars[typeof(ImportContext)];

            if (impctx == null)
            {
                impctx = JsonConvert.CreateImportContext();
                appVars.Add(typeof(ImportContext), impctx);
            }

            dispatcher.JsonImporter = new JsonImportHandler(impctx.Import);

            _impctx = impctx;
            _expctx = expctx;
        }
Example #20
0
 protected override object ImportFromString(Jayrock.Json.Conversion.ImportContext context, JsonReader reader)
 {
     try
     {
         string val = reader.ReadString();
         int    i   = 0;
         foreach (string item in values)
         {
             if (item == val)
             {
                 return(i);
             }
             i++;
         }
         throw new JsonException("Error importing JSON String as " + this.OutputType.FullName + ".");
     }
     catch (FormatException e)
     {
         throw new JsonException("Error importing JSON String as " + this.OutputType.FullName + ".", e);
     }
 }
Example #21
0
 public virtual object Import(ImportContext context, JsonReader reader)
 {
     if (context == null)
         throw new ArgumentNullException("context");
     
     if (reader == null)
         throw new ArgumentNullException("reader");
     
     if (!reader.MoveToContent())
         throw new JsonException("Unexpected EOF.");
     
     if (reader.TokenClass == JsonTokenClass.Null)
     {
         return ImportNull(context, reader);
     }
     else if (reader.TokenClass == JsonTokenClass.String)
     {
         return ImportFromString(context, reader);
     }
     else if (reader.TokenClass == JsonTokenClass.Number)
     {
         return ImportFromNumber(context, reader);
     }
     else if (reader.TokenClass == JsonTokenClass.Boolean)
     {
         return ImportFromBoolean(context, reader);
     }
     else if (reader.TokenClass == JsonTokenClass.Array)
     {
         return ImportFromArray(context, reader);
     }
     else if (reader.TokenClass == JsonTokenClass.Object)
     {
         return ImportFromObject(context, reader);
     }
     else 
     {
         throw new JsonException(string.Format("{0} not expected.", reader.TokenClass));
     }
 }
Example #22
0
 public object Import(ImportContext context, JsonReader reader)
 {
     throw new NotImplementedException();
 }
Example #23
0
 protected override object ImportFromString(ImportContext context, JsonReader reader)
 {
     return ReflectImport(context, reader);
 }
Example #24
0
        private static ObjectConstructionResult TryCreateObject(ImportContext context, ConstructorInfo ctor, NamedJsonBuffer[] members)
        {
            Debug.Assert(context != null);
            Debug.Assert(ctor != null);
            Debug.Assert(members != null);

            ParameterInfo[] parameters = ctor.GetParameters();

            if (parameters.Length > members.Length)
            {
                return(null);
            }

            int[] bindings = Bind(context, parameters, members);

            int argc = 0;

            object[]         args  = null;
            JsonBufferWriter tailw = null;

            for (int i = 0; i < bindings.Length; i++)
            {
                int binding = bindings[i] - 1;

                if (binding >= 0)
                {
                    if (args == null)
                    {
                        args = new object[parameters.Length];
                    }

                    Type       type = parameters[binding].ParameterType;
                    JsonBuffer arg  = members[i].Buffer;
                    args[binding] = context.Import(type, arg.CreateReader());
                    argc++;
                }
                else
                {
                    if (tailw == null)
                    {
                        tailw = new JsonBufferWriter();
                        tailw.WriteStartObject();
                    }

                    NamedJsonBuffer member = members[i];
                    tailw.WriteMember(member.Name);
                    tailw.WriteFromReader(member.Buffer.CreateReader());
                }
            }

            if (tailw != null)
            {
                tailw.WriteEndObject();
            }

            if (argc != parameters.Length)
            {
                return(null);
            }

            object obj = ctor.Invoke(args);

            JsonBuffer tail = tailw != null
                            ? tailw.GetBuffer()
                            : StockJsonBuffers.EmptyObject;

            return(new ObjectConstructionResult(obj, tail.CreateReader()));
        }
Example #25
0
 public abstract object OnCreateObject(ImportContext context);
Example #26
0
 public object Import(ImportContext context, JsonReader reader)
 {
     throw new NotImplementedException();
 }
Example #27
0
        protected virtual void Import(ImportContext context, JsonReader reader)
        {
            if (context == null)
                throw new ArgumentNullException("context");

            if (reader == null)
                throw new ArgumentNullException("reader");

            // FIXME: Consider making this method exception-safe.
            // Right now this is a problem because of reliance on
            // DictionaryBase.
            
            Clear();
            
            reader.ReadToken(JsonTokenClass.Object);
            
            while (reader.TokenClass != JsonTokenClass.EndObject)
                Put(reader.ReadMember(), context.Import(reader));
            
            reader.Read();
        }
Example #28
0
 void IJsonImportable.Import(ImportContext context, JsonReader reader)
 {
     Import(context, reader);
 }
Example #29
0
        public void YahooNewsSearch()
        {
            string text = @"
            /* Source: http://api.search.yahoo.com/NewsSearchService/V1/newsSearch?appid=YahooDemo&query=yahoo&results=3&language=en&output=json */
            {
                'ResultSet': {
                    'totalResultsAvailable': '2393',
                    'totalResultsReturned': 3,
                    'firstResultPosition': '1',
                    'Result': [
                        {
                            'Title': 'Yahoo invites its users to shoot ads',
                            'Summary': ' Yahoo first encouraged consumers to create blogs and photo pages with text and pictures. Now, the Internet portal wants them to make advertisements, too. On Monday, Yahoo touts a new look for its front page by asking people to pull out the video camera, open up the editing software and create 12-second spot for Yahoo.',
                            'Url': 'http://news.yahoo.com/s/usatoday/20060717/tc_usatoday/yahooinvitesitsuserstoshootads',
                            'ClickUrl': 'http://news.yahoo.com/s/usatoday/20060717/tc_usatoday/yahooinvitesitsuserstoshootads',
                            'NewsSource': 'USATODAY.com via Yahoo! News',
                            'NewsSourceUrl': 'http://news.yahoo.com/',
                            'Language': 'en',
                            'PublishDate': '1153133816',
                            'ModificationDate': '1153134044'
                        },
                        {
                            'Title': 'Yahoo to launch new finance features',
                            'Summary': ' Yahoo Inc. is beefing up the finance section of its Web site with more interactive stock charts and other features to help it maintain its longtime lead over rival financial information sites.',
                            'Url': 'http://news.yahoo.com/s/ap/20060717/ap_on_hi_te/yahoo_finance_2',
                            'ClickUrl': 'http://news.yahoo.com/s/ap/20060717/ap_on_hi_te/yahoo_finance_2',
                            'NewsSource': 'AP via Yahoo! News',
                            'NewsSourceUrl': 'http://news.yahoo.com/',
                            'Language': 'en',
                            'PublishDate': '1153134777',
                            'ModificationDate': '1153134920',
                            'Thumbnail': {
                                'Url': 'http://us.news2.yimg.com/us.yimg.com/p/ap/20060714/vsthumb.8b1161b66b564adba0a5bbd6339c9379.media_summit_idet125.jpg',
                                'Height': '82',
                                'Width': '76'
                            }
                        }, 
                        {
                            'Title': 'Yahoo Finance revises charts, chat, other features',
                            'Summary': ' Yahoo Inc. on Monday will unveil an upgraded version of its top-ranked financial information site that features new stock charting tools, improved investor chat rooms and financial video news.',
                            'Url': 'http://news.yahoo.com/s/nm/20060717/wr_nm/media_yahoo_finance_dc_2',
                            'ClickUrl': 'http://news.yahoo.com/s/nm/20060717/wr_nm/media_yahoo_finance_dc_2',
                            'NewsSource': 'Reuters via Yahoo! News',
                            'NewsSourceUrl': 'http://news.yahoo.com/',
                            'Language': 'en',
                            'PublishDate': '1153113288',
                            'ModificationDate': '1153113674'
                        }
                    ]
                }
            }";
            
            JsonTextReader reader = new JsonTextReader(new StringReader(text));
            ImportContext context = new ImportContext();
            YahooResponse response = (YahooResponse) context.Import(typeof(YahooResponse), reader);
            Assert.IsNotNull(response);
            
            YahooResultSet resultSet = response.ResultSet;
            Assert.IsNotNull(resultSet);
            Assert.AreEqual(2393,  resultSet.totalResultsAvailable);
            Assert.AreEqual(3,  resultSet.totalResultsReturned);
            Assert.AreEqual(1,  resultSet.firstResultPosition);
            Assert.AreEqual(3,  resultSet.Result.Length);
            
            YahooResult result = resultSet.Result[0];
            
            Assert.IsNotNull(result);
            Assert.AreEqual("Yahoo invites its users to shoot ads", result.Title);
            Assert.AreEqual(" Yahoo first encouraged consumers to create blogs and photo pages with text and pictures. Now, the Internet portal wants them to make advertisements, too. On Monday, Yahoo touts a new look for its front page by asking people to pull out the video camera, open up the editing software and create 12-second spot for Yahoo.", result.Summary);
            Assert.AreEqual("http://news.yahoo.com/s/usatoday/20060717/tc_usatoday/yahooinvitesitsuserstoshootads", result.Url);
            Assert.AreEqual("http://news.yahoo.com/s/usatoday/20060717/tc_usatoday/yahooinvitesitsuserstoshootads", result.ClickUrl);
            Assert.AreEqual("USATODAY.com via Yahoo! News", result.NewsSource);
            Assert.AreEqual("http://news.yahoo.com/", result.NewsSourceUrl);
            Assert.AreEqual("en", result.Language);
            Assert.AreEqual(1153133816, result.PublishDate);
            Assert.AreEqual(1153134044, result.ModificationDate);
            
            result = resultSet.Result[1];

            Assert.AreEqual("Yahoo to launch new finance features", result.Title);
            Assert.AreEqual(" Yahoo Inc. is beefing up the finance section of its Web site with more interactive stock charts and other features to help it maintain its longtime lead over rival financial information sites.", result.Summary);
            Assert.AreEqual("http://news.yahoo.com/s/ap/20060717/ap_on_hi_te/yahoo_finance_2", result.Url);
            Assert.AreEqual("http://news.yahoo.com/s/ap/20060717/ap_on_hi_te/yahoo_finance_2", result.ClickUrl);
            Assert.AreEqual("AP via Yahoo! News", result.NewsSource);
            Assert.AreEqual("http://news.yahoo.com/", result.NewsSourceUrl);
            Assert.AreEqual("en", result.Language);
            Assert.AreEqual(1153134777, result.PublishDate);
            Assert.AreEqual(1153134920, result.ModificationDate);
            Assert.AreEqual("http://us.news2.yimg.com/us.yimg.com/p/ap/20060714/vsthumb.8b1161b66b564adba0a5bbd6339c9379.media_summit_idet125.jpg", result.Thumbnail.Url);
            Assert.AreEqual(82, result.Thumbnail.Height);
            Assert.AreEqual(76, result.Thumbnail.Width);

            result = resultSet.Result[2];

            Assert.AreEqual("Yahoo Finance revises charts, chat, other features", result.Title);
            Assert.AreEqual(" Yahoo Inc. on Monday will unveil an upgraded version of its top-ranked financial information site that features new stock charting tools, improved investor chat rooms and financial video news.", result.Summary);
            Assert.AreEqual("http://news.yahoo.com/s/nm/20060717/wr_nm/media_yahoo_finance_dc_2", result.Url);
            Assert.AreEqual("http://news.yahoo.com/s/nm/20060717/wr_nm/media_yahoo_finance_dc_2", result.ClickUrl);
            Assert.AreEqual("Reuters via Yahoo! News", result.NewsSource);
            Assert.AreEqual("http://news.yahoo.com/", result.NewsSourceUrl);
            Assert.AreEqual("en", result.Language);
            Assert.AreEqual(1153113288, result.PublishDate);
            Assert.AreEqual(1153113674, result.ModificationDate);
        }
Example #30
0
 void IObjectMemberImporter.Import(ImportContext context, JsonReader reader, object target)
 {
     ImportArgs = new object[] { context, reader, target };
     ImportedValue = context.Import(typeof(object), reader);
     _sequence.Add(this);
 }
Example #31
0
 private static object Import(Type expectedType, string s)
 {
     JsonReader reader = CreateReader(s);
     ImportContext context = new ImportContext();
     object o = context.Import(expectedType, reader);
     Assert.IsTrue(reader.EOF, "Reader must be at EOF.");
     Assert.IsNotNull(o);
     Assert.IsInstanceOfType(expectedType, o);
     return o;
 }
Example #32
0
 public bool Import(ImportContext context, string name, JsonReader reader)
 {
     if (reader.TokenClass != JsonTokenClass.String)
         return false;
     NonMembers[name] = context.Import(reader);
     return true;
 }
        protected virtual object ParseRequest(TextReader input)
        {
            if (input == null)
                throw new ArgumentNullException("input");

            JsonReader reader = (JsonReader) _serviceProvider.GetService(typeof(JsonReader));

            if (reader == null)
                reader = new JsonTextReader(input);

            ImportContext importContext = new ImportContext();

            JsonObject request = new JsonObject();
            Method method = null;
            JsonReader paramsReader = null;
            object args = null;

            reader.ReadToken(JsonTokenClass.Object);

            while (reader.TokenClass != JsonTokenClass.EndObject)
            {
                string memberName = reader.ReadMember();

                switch (memberName)
                {
                    case "id" :
                    {
                        request["id"] = importContext.Import(reader);
                        break;
                    }

                    case "method" :
                    {
                        string methodName = reader.ReadString();
                        request["method"] = methodName;
                        method = _service.GetClass().GetMethodByName(methodName);

                        if (paramsReader != null)
                        {
                            //
                            // If the parameters were already read in and
                            // buffer, then deserialize them now that we know
                            // the method we're dealing with.
                            //

                            args = ReadParameters(method, paramsReader, importContext);
                            paramsReader = null;
                        }

                        break;
                    }

                    case "params" :
                    {
                        //
                        // Is the method already known? If so, then we can
                        // deserialize the parameters right away. Otherwise
                        // we record them until hopefully the method is
                        // encountered.
                        //

                        if (method != null)
                        {
                            args = ReadParameters(method, reader, importContext);
                        }
                        else
                        {
                            JsonRecorder recorder = new JsonRecorder();
                            recorder.WriteFromReader(reader);
                            paramsReader = recorder.CreatePlayer();
                        }

                        break;
                    }

                    default:
                    {
                        reader.Skip();
                        break;
                    }
                }
            }

            reader.Read();

            if (args != null)
                request["params"] = args;

            return request;
        }
        private static object ReadParameters(Method method, JsonReader reader, ImportContext importContext)
        {
            Debug.Assert(method != null);
            Debug.Assert(reader != null);
            Debug.Assert(importContext != null);

            reader.MoveToContent();

            Parameter[] parameters = method.GetParameters();

            if (reader.TokenClass == JsonTokenClass.Array)
            {
                reader.Read();
                ArrayList argList = new ArrayList(parameters.Length);

                // TODO: This loop could bomb when more args are supplied that parameters available.

                for (int i = 0; i < parameters.Length && reader.TokenClass != JsonTokenClass.EndArray; i++)
                    argList.Add(importContext.Import(parameters[i].ParameterType, reader));

                reader.StepOut();
                return argList.ToArray();
            }
            else if (reader.TokenClass == JsonTokenClass.Object)
            {
                reader.Read();
                JsonObject argByName = new JsonObject();

                while (reader.TokenClass != JsonTokenClass.EndObject)
                {
                    // TODO: Imporve this lookup.
                    // FIXME: Does not work when argument is positional.

                    Type parameterType = AnyType.Value;
                    string name = reader.ReadMember();

                    foreach (Parameter parameter in parameters)
                    {
                        if (parameter.Name.Equals(name))
                        {
                            parameterType = parameter.ParameterType;
                            break;
                        }
                    }

                    argByName.Put(name, importContext.Import(parameterType, reader));
                }

                reader.Read();
                return argByName;
            }
            else
            {
                return importContext.Import(reader);
            }
        }
 public void SetImportContext()
 {
     JsonRpcDispatcher dispatcher = new JsonRpcDispatcher(new TestService());
     ImportContext context = new ImportContext();
     dispatcher.ImportContext = context;
     Assert.AreSame(context, dispatcher.ImportContext);
 }
 public void Import(ImportContext context, JsonReader reader)
 {
     ImportCalled = true;
 }
Example #37
0
 public void NonMemberImport()
 {
     ComponentImporter importer = new ComponentImporter(typeof(DynamicThing));
     ImportContext context = new ImportContext();
     const string json = "{ str1: value1, str2: value2, num: 42 }";
     DynamicThing thing = (DynamicThing) importer.Import(context, JsonText.CreateReader(json));
     Assert.AreEqual(2, thing.NonMembers.Count);
     Assert.AreEqual("value1", thing.NonMembers["str1"]);
     Assert.AreEqual("value2", thing.NonMembers["str2"]);
 }