示例#1
0
        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);
            }));
        }
示例#2
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);
        }
示例#3
0
        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);
        }