How to parse JSON to a dynamic object on Windows Phone 7?

后端 未结 1 1160
庸人自扰
庸人自扰 2020-12-10 21:10

For web applications I can use System.Web and use this trick to convert JSON to a dynamic object.

But for Windows Phone I can\'t use JavaScriptCon

相关标签:
1条回答
  • 2020-12-10 21:38

    Json.Net ( http://james.newtonking.com/pages/json-net.aspx )

    -----EDIT-----

    If WP7 supports DynamicObject:

    using System;
    using System.Dynamic;
    using System.Collections;
    
    using Newtonsoft.Json;
    using Newtonsoft.Json.Linq;
    
    public class JSonTest 
    {
        public static void Main()
        {
            string jsonStr = @"
                { 
                    'glossary': { 
                        'title': 'example glossary', 
                        'GlossDiv': { 
                            'title': 'S', 
                            'GlossList': { 
                                'GlossEntry': { 
                                    'ID': 'SGML', 
                                    'SortAs': 'SGML', 
                                    'GlossTerm': 'Standard Generalized Markup Language', 
                                    'Acronym': 'SGML', 
                                    'Abbrev': 'ISO 8879:1986', 
                                    'GlossDef': { 
                                        'para': 'A meta-markup language, used to create markup languages such as DocBook.', 
                                        'GlossSeeAlso': ['GML','XML'] 
                                    }, 
                                    'GlossSee': 'markup' 
                                } 
                            } 
                        } 
                    } 
                }
            ";
    
            JObject o = (JObject)JsonConvert.DeserializeObject(jsonStr);
            dynamic json = new JsonObject(o);
            Console.WriteLine(json.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso.Length);
            Console.WriteLine(json.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso[1]);
            foreach (var x in json.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso)
            {
                Console.WriteLine(x);
            }
            Console.ReadLine();
        }
    }
    
    class JsonObject : DynamicObject,IEnumerable,IEnumerator
    {
        object _object;
    
        public JsonObject(object jObject)
        {
            this._object = jObject;
        }
    
        public object this[int i]
        {
            get
            {
                if (!(_object is JArray)) return null;
    
                object obj = (_object as JArray)[i];
                if (obj is JValue)
                {
                    return ((JValue)obj).ToString();
                }
                return new JsonObject(obj);
            }
        }
    
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            result = null;
    
            if (_object is JArray && binder.Name == "Length")
            {
                result = (_object as JArray).Count;
                return true;
            }
    
            JObject jObject = _object as JObject;
            object obj = jObject.SelectToken(binder.Name);
    
            if (obj is JValue)
                result = ((JValue)obj).ToString();
            else
                result = new JsonObject(jObject.SelectToken(binder.Name));
    
            return true;
        }
    
        public override string ToString()
        {
            return _object.ToString();
        }
    
        int _index = -1;
    
        public IEnumerator GetEnumerator()
        {
            _index = -1;
            return this;
        }
    
        public object Current
        {
            get 
            {
                if (!(_object is JArray)) return null;
                object obj = (_object as JArray)[_index];
                if (obj is JValue) return ((JValue)obj).ToString();
                return obj;
            }
        }
    
        public bool MoveNext()
        {
            if (!(_object is JArray)) return false;
            _index++;
            return _index <(_object as JArray).Count;
        }
    
        public void Reset()
        {
            throw new NotImplementedException();
        }
    }
    
    0 讨论(0)
提交回复
热议问题