zoukankan      html  css  js  c++  java
  • Json对象处理.将对象处理成dic数组.

    var parser = new JsonConfigurationFileParser();
    var dict = parser.Parse("json");

    using Newtonsoft.Json.Linq;
    using System;
    using System.Collections.Generic;
    using System.Linq;

    namespace Demo
    {
    internal class JsonConfigurationFileParser
    {
    private readonly IDictionary<string, string> _data = new SortedDictionary<string, string>(StringComparer.OrdinalIgnoreCase);
    private readonly Stack<string> _context = new Stack<string>();
    private string _currentPath;

    public IDictionary<string, string> Parse(string content)
    {
    _data.Clear();
    var jsonConfig = JObject.Parse(content);
    VisitJObject(jsonConfig);
    return _data;
    }

    private void VisitJObject(JObject jObject)
    {
    foreach (var property in jObject.Properties())
    {
    EnterContext(property.Name);
    VisitProperty(property);
    ExitContext();
    }
    }

    private void VisitProperty(JProperty property)
    {
    VisitToken(property.Value);
    }

    private void VisitToken(JToken token)
    {
    switch (token.Type)
    {
    case JTokenType.Object:
    VisitJObject(token.Value<JObject>());
    break;

    case JTokenType.Array:
    VisitArray(token.Value<JArray>());
    break;

    case JTokenType.Integer:
    case JTokenType.Float:
    case JTokenType.String:
    case JTokenType.Boolean:
    case JTokenType.Bytes:
    case JTokenType.Raw:
    case JTokenType.Null:
    VisitPrimitive(token);
    break;

    default:
    throw new FormatException("FormatError_UnsupportedJSONToken");
    }
    }

    private void VisitArray(JArray array)
    {
    for (int index = 0; index < array.Count; index++)
    {
    EnterContext(index.ToString());
    VisitToken(array[index]);
    ExitContext();
    }
    }

    private void VisitPrimitive(JToken data)
    {
    var key = _currentPath;

    if (_data.ContainsKey(key))
    {
    throw new FormatException("FormatError_KeyIsDuplicated");
    }
    _data[key] = data.ToString();
    }

    private void EnterContext(string context)
    {
    _context.Push(context);
    _currentPath = ConfigurationPath.Combine(_context.Reverse());
    }

    private void ExitContext()
    {
    _context.Pop();
    _currentPath = ConfigurationPath.Combine(_context.Reverse());
    }
    }
    }

  • 相关阅读:
    Kali Linux软件更新日报20190622
    Maltego更新到4.2.4.12374
    Kali Linux又增加一个顶级域名kali.download
    Nessus提示API Disabled错误
    数据包分析中Drop和iDrop的区别
    快速识别Hash加密方式hashid
    识别哈希算法类型hash-identifier
    vue实现前端导出excel表格
    vue自动化单元测试
    Mock制作假数据
  • 原文地址:https://www.cnblogs.com/mailaidedt/p/7085842.html
Copyright © 2011-2022 走看看