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

  • 相关阅读:
    c#读取.config文件内容
    c# 读取配置文件方法
    C# Log4net详细说明
    C# 运算符集
    LeetCode 69_ x 的平方根
    LeetCode 172 _ 阶乘后的零
    LeetCode 171 _ Excel表列序号
    LeetCode 88 _ 合并两个有序数组
    LeetCode 581 _ 最短无序连续子数组
    LeetCode 283 _ 移动零
  • 原文地址:https://www.cnblogs.com/mailaidedt/p/7085842.html
Copyright © 2011-2022 走看看