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

  • 相关阅读:
    javascript之面向对象学习笔记03
    javascript之面向对象学习笔记02
    javascript之面向对象学习笔记01
    记第一次用Linux搭建LAMP环境
    C#随机数
    Android简单的TXT文件存储
    关于Android的ListView一点使用方法
    Android与C#的socket通讯
    Android调用WebService
    并发编程之进程、线程、同步锁 -1
  • 原文地址:https://www.cnblogs.com/mailaidedt/p/7085842.html
Copyright © 2020-2023  润新知