public static ConfigObject ParseJson(string json) { string[] lines = json.Split(new[] { '\n' }); // remove lines that start with a dash # character IEnumerable <string> filtered = from l in lines where !(Regex.IsMatch(l, @"^\s*#(.*)")) select l; string filtered_json = string.Join("\n", filtered); dynamic parsed = JsonConvert.DeserializeObject <ExpandoObject>(filtered_json, new ExpandoObjectConverter()); // convert the ExpandoObject to ConfigObject before returning return(ConfigObject.FromExpando(parsed)); }
/// <summary> /// Merge the specified obj2 and obj1, where obj1 has precendence and /// overrules obj2 if necessary. /// </summary> /// <exception cref='TypeMissmatchException'> /// Is thrown when the type missmatch exception. /// </exception> public static dynamic Merge(dynamic m_obj1, dynamic m_obj2) { dynamic obj1 = m_obj1; dynamic obj2 = m_obj2; // make sure we only deal with ConfigObject but not ExpandoObject as currently // return from JsonFX if (obj1 is ExpandoObject) { obj1 = ConfigObject.FromExpando(obj1); } if (obj2 is ExpandoObject) { obj2 = ConfigObject.FromExpando(obj2); } // if both objects are NullExceptionPreventer, return a ConfigObject so the // user gets an "Empty" ConfigObject if (obj1 is NullExceptionPreventer && obj2 is NullExceptionPreventer) { return(new ConfigObject()); } // if any object is of NullExceptionPreventer, the other object gets precedence / overruling if (obj1 is NullExceptionPreventer && obj2 is ConfigObject) { return(obj2); } if (obj2 is NullExceptionPreventer && obj1 is ConfigObject) { return(obj1); } // handle what happens if one of the args is null if (obj1 == null && obj2 == null) { return(new ConfigObject()); } if (obj2 == null) { return(obj1); } if (obj1 == null) { return(obj2); } if (obj1.GetType() != obj2.GetType()) { throw new TypeMissmatchException(); } // changes in the dictionary WILL REFLECT back to the object var dict1 = (IDictionary <string, object>)(obj1); var dict2 = (IDictionary <string, object>)(obj2); dynamic result = new ConfigObject(); var rdict = (IDictionary <string, object>)result; // first, copy all non colliding keys over foreach (var kvp in dict1) { if (!dict2.Keys.Contains(kvp.Key)) { rdict.Add(kvp.Key, kvp.Value); } } foreach (var kvp in dict2) { if (!dict1.Keys.Contains(kvp.Key)) { rdict.Add(kvp.Key, kvp.Value); } } // now handle the colliding keys foreach (var kvp1 in dict1) { // skip already copied over keys if (!dict2.Keys.Contains(kvp1.Key) || dict2[kvp1.Key] == null) { continue; } var kvp2 = new KeyValuePair <string, object>(kvp1.Key, dict2[kvp1.Key]); // some shortcut variables to make code more readable string key = kvp1.Key; object value1 = kvp1.Value; object value2 = kvp2.Value; Type type1 = value1.GetType(); Type type2 = value1.GetType(); // check if both are same type if (type1 != type2) { throw new TypeMissmatchException(); } if (value1 is ConfigObject[]) { rdict[key] = CollectionMerge(value1, value2); /*var d1 = val1 as IDictionary<string, object>; * var d2 = val2 as IDictionary<string, object>; * rdict[key] = CollectionMerge (val1, val2); */ } else if (value1 is ConfigObject) { rdict[key] = Merge(value1, value2); } else if (value1 is string) { rdict[key] = value1; } else if (value1 is IEnumerable) { rdict[key] = CollectionMerge(value1, value2); } else { rdict[key] = value1; } //else if (kvp.Value.GetType ().IsByRef) { // recursively merge it //} } return(result); }