private Task AnalyzeJsonDocument(JObject node, JsonDocument document, CompareConfigDocument config, string paddingString) { return(Task.Factory.StartNew(() => { var queue = new Queue <JToken>(); queue.Enqueue(node); do { var item = queue.Dequeue(); if (item.Type == JTokenType.Array) { (item as JArray).Children() .Where(child => child.Type == JTokenType.Object) .ToList() .ForEach(child => queue.Enqueue(child as JObject)); } else if (item.Type == JTokenType.Object) { (item as JObject).Properties().ToList().ForEach(property => { var newNode = AnalyzeNode(property, document, config, paddingString); if (newNode != null) { queue.Enqueue(newNode); } }); } } while (queue.Count != 0); })); }
private JToken AnalyzeNode(JProperty node, JsonDocument document, CompareConfigDocument config, string paddingString) { if (!node.HasValues) { return(null); } var path = GetThePath(node.Path, paddingString, config.PropertyNodesName); if (node.Value.Type == JTokenType.Object) { if (!config.PropertyNodesName.Contains(node.Name)) { document.CreateProperty(path); foreach (var fieldInfo in config.FieldInfos) { document[path][fieldInfo.FieldName] = fieldInfo.DefaultValue.ToString(); } } return(node.Value); } else if (node.Value.Type == JTokenType.Array) { return(node.Value); } else if (supportJTokenTypes.Values.Contains(node.Value.Type)) { path = path.Replace($".{node.Name}", ""); var info = config.FieldInfos.FirstOrDefault(fieldInfo => fieldInfo.FieldName.Equals(node.Name)); if (info == null) { return(null); } if (info.NeedReplace && info.ReplaceValue.ToString().Equals(node.Value.ToString())) { document[path].UpdateValue(node.Name, info.DefaultValue.ToString()); } else if (supportJTokenTypes[info.FieldType] == node.Value.Type) { document[path].UpdateValue(node.Name, node.Value.ToString()); } } return(null); }
public async Task <JsonDocument> GetJsonDocument(string fileName, CompareConfigDocument config) { Trace.Indent(); Trace.TraceInformation($"Start to read data in file {fileName}"); var jsonFile = jsonDocumentService.ReadJsonFile(fileName); var node = jsonDocumentService.GetNode(jsonFile, config.StartNodeName) as JObject; if (node == null) { throw new NotSupportedException($"Cannot find JSON node {config.StartNodeName} in {fileName}"); } Trace.TraceInformation("Reading properties in document"); var document = new JsonDocument( Path.GetFileNameWithoutExtension(fileName), config.FieldInfos.Select(item => new KeyValuePair <string, FieldType>(item.FieldName, item.FieldType)).ToList()); await AnalyzeJsonDocument(node, document, config, node.Path.Remove(node.Path.Length - config.StartNodeName.Length));; Trace.Unindent(); return(document); }