您的位置:首页 > Web前端 > JavaScript

Json对象处理.将对象处理成dic数组.

2017-06-27 16:21 330 查看


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());
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: