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); }
/// <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); } }
/// <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; }