博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Json对象处理.将对象处理成dic数组.
阅读量:6587 次
发布时间:2019-06-24

本文共 1979 字,大约阅读时间需要 6 分钟。

 

 

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

转载于:https://www.cnblogs.com/mailaidedt/p/7085842.html

你可能感兴趣的文章
HTML5 API 浏览器支持情况检测
查看>>
不要把<a href="">当作按钮用
查看>>
原码, 反码, 补码 详解
查看>>
在fmri研究中,cca的应用历史
查看>>
[转]分析MySQL数据类型的长度【mysql数据字段 中length和decimals的作用!熟悉mysql必看】...
查看>>
[Js插件]使用JqueryUI的弹出框做一个“炫”的登录页面
查看>>
Apache mod_rewrite规则重写的标志一览
查看>>
不要让Javascript的等价表格看上去那么难看
查看>>
js作为参数,并且返回值;js的回调模式 callback
查看>>
filestream streamreader
查看>>
优秀博文
查看>>
Ckeditor 的加载顺序
查看>>
java内存模型(netty权威指南)
查看>>
Fragment问题集
查看>>
NSNotificationCenter详解
查看>>
【javascript】浮点数运算问题分析及解决方法
查看>>
TQ2440实现触摸屏和qt图形 解决segmentation fault
查看>>
HBase的JavaAPI使用
查看>>
Debian GNU/kFreeBSD是什么
查看>>
使用base64:url 来定义背景图片url
查看>>