예제 #1
0
        public static bool checkKey(JavaScriptObject obj, String key)
        {
            if (obj == null)
            {
                return(false);
            }

            if (String.IsNullOrEmpty(key))
            {
                return(false);
            }

            if (!obj.Contains(key))
            {
                return(false);
            }


            return(true);
        }
예제 #2
0
        /// <summary>
        /// 用sub中的内容覆盖main中的内容
        /// </summary>
        /// <param name="jsMain"></param>
        /// <param name="jsSub"></param>
        /// <returns></returns>
        public static IJavaScriptObject OrJson(IJavaScriptObject jsMain, IJavaScriptObject jsSub)
        {
            if (jsSub == null)  //jsSub为NULL
            {
                //直接覆盖输出
                return(null);
            }
            else if (
                jsSub is JavaScriptNumber ||  //jsSub为数字类型
                jsSub is JavaScriptBoolean || //jsSub为布尔类型
                jsSub is JavaScriptString     //jsSub为文本类型
                )
            {
                //基本数据类型直接复制输出
                return(jsSub);
            }
            else if (jsSub is JavaScriptArray)  //jsSub为数组类型
            {
                JavaScriptArray jsNew = new JavaScriptArray();

                if (jsMain is JavaScriptArray)
                {
                    JavaScriptArray jaSub  = jsSub as JavaScriptArray;
                    JavaScriptArray jaMain = jsMain as JavaScriptArray;

                    for (int i = 0; i < jaSub.Count; i++)
                    {
                        IJavaScriptObject q;
                        if (i < jaMain.Count && jaMain[i] != null && jaSub[i] != null && jaMain[i].GetType() == jaSub[i].GetType())
                        {
                            q = OrJson(jaMain[i], jaSub[i]);
                        }
                        else
                        {
                            q = jaSub[i];
                        }

                        jsNew.Add(q);
                    }

                    if (jaMain.Count > jaSub.Count)
                    {
                        for (int j = jaSub.Count; j < jaMain.Count; j++)
                        {
                            jsNew.Add(jaMain[j]);
                        }
                    }
                }
                else
                {
                    JavaScriptArray jaSub = jsSub as JavaScriptArray;
                    for (int i = 0; i < jaSub.Count; i++)
                    {
                        jsNew.Add(jaSub[i]);
                    }
                }
                return(jsNew);
            }
            else if (jsSub is JavaScriptObject) //jsSub为对象类型
            {
                JavaScriptObject jsNew = new JavaScriptObject();

                if (jsMain is JavaScriptObject)
                {
                    JavaScriptObject joSub  = jsSub as JavaScriptObject;
                    JavaScriptObject joMain = jsMain as JavaScriptObject;

                    foreach (string k in joSub.Keys)
                    {
                        if (joMain.Contains(k) && joSub[k] != null && joMain[k] != null && joSub[k].GetType() == joMain[k].GetType())
                        {
                            IJavaScriptObject q = OrJson(joMain[k], joSub[k]);
                            jsNew.Add(k, q);
                        }
                        else
                        {
                            jsNew.Add(k, joSub[k]);
                        }
                    }

                    foreach (string k in joMain.Keys)
                    {
                        if (!jsNew.Contains(k))
                        {
                            jsNew.Add(k, joMain[k]);
                        }
                    }
                }
                else
                {
                    JavaScriptObject joSub = jsSub as JavaScriptObject;
                    foreach (string k in joSub.Keys)
                    {
                        jsNew.Add(k, joSub[k]);
                    }
                }
                return(jsNew);
            }
            else
            {
                //未知的jsSub类型,不修改jsMain
                return(jsMain);
            }
        }
예제 #3
0
		/// <summary>
		/// Converts an XML document to an IJavaScriptObject (JSON).
		/// <see cref="http://www.xml.com/pub/a/2006/05/31/converting-between-xml-and-json.html?page=1">Stefan Goessner</see>
		/// 	<see cref="http://developer.yahoo.com/common/json.html#xml">Yahoo XML JSON</see>
		/// </summary>
		/// <param name="n">The XmlNode to serialize to JSON.</param>
		/// <returns>A IJavaScriptObject.</returns>
		public static IJavaScriptObject GetIJavaScriptObjectFromXmlNode(XmlNode n)
		{
			if (n == null)
				return null;

			//if (xpath == "" || xpath == "/")
			//    xpath = n.Name;

			System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(@"\w+|\W+", System.Text.RegularExpressions.RegexOptions.Compiled);
			JavaScriptObject o = new JavaScriptObject();

			if (n.NodeType == XmlNodeType.Element)
			{
				for (int i = 0; i < n.Attributes.Count; i++)
				{
					o.Add("@" + n.Attributes[i].Name, new JavaScriptString(n.Attributes[i].Value));
				}

				if (n.FirstChild != null)	// element has child nodes
				{
					int textChild = 0;
					bool hasElementChild = false;

					for (XmlNode e = n.FirstChild; e != null; e = e.NextSibling)
					{
						if (e.NodeType == XmlNodeType.Element) hasElementChild = true;
						if (e.NodeType == XmlNodeType.Text && r.IsMatch(e.InnerText)) textChild++;	// non-whitespace text
					}

					if (hasElementChild)
					{
						if (textChild < 2)	// structured element with evtl. a single text node
						{
							for (XmlNode e = n.FirstChild; e != null; e = e.NextSibling)
							{
								if (e.NodeType == XmlNodeType.Text)
								{
									o.Add("#text", new JavaScriptString(e.InnerText));
								}
								else if (o.Contains(e.Name))
								{
									if (o[e.Name] is JavaScriptArray)
									{
										((JavaScriptArray)o[e.Name]).Add(GetIJavaScriptObjectFromXmlNode(e));
									}
									else
									{
										IJavaScriptObject _o = o[e.Name];
										JavaScriptArray a = new JavaScriptArray();
										a.Add(_o);
										a.Add(GetIJavaScriptObjectFromXmlNode(e));
										o[e.Name] = a;
									}
								}
								else
								{
									o.Add(e.Name, GetIJavaScriptObjectFromXmlNode(e));
								}
							}
						}
					}
					else if (textChild > 0)
					{
						if (n.Attributes.Count == 0)
							return new JavaScriptString(n.InnerText);
						else
							o.Add("#text", new JavaScriptString(n.InnerText));
					}
				}
				if (n.Attributes.Count == 0 && n.FirstChild == null)
					return new JavaScriptString(n.InnerText);
			}
			else if (n.NodeType == XmlNodeType.Document)
				return GetIJavaScriptObjectFromXmlNode(((XmlDocument)n).DocumentElement);
			else
				throw new NotSupportedException("Unhandled node type '" + n.NodeType + "'.");

			return o;
		}