/// <summary>
/// json转换为键值对辅助类
/// </summary>
public class JsonParser
{ private static Dictionary<string, string> lst_KeyValueData = null; public static Dictionary<string, string> SplitJsonStringToKeyValuePairs(string jsonStr)
{
char jsonBeginToken = '{';
char jsonEndToken = '}'; if (string.IsNullOrEmpty(jsonStr))
{
return null;
}
//验证json字符串格式
if (jsonStr[] != jsonBeginToken || jsonStr[jsonStr.Length - ] != jsonEndToken)
{
throw new ArgumentException("非法的Json字符串!");
} lst_KeyValueData = new Dictionary<string, string>(); JObject jobj = new JObject(); // 转换为json对象
jobj = JObject.Parse(jsonStr);
ParseJsonProperties(jobj); return lst_KeyValueData; } private static void ParseJsonProperties(JObject jObject)
{
IEnumerable<JProperty> jObject_Properties = jObject.Properties(); JTokenType[] validPropertyValueTypes = { JTokenType.String, JTokenType.Integer, JTokenType.Float, JTokenType.Boolean, JTokenType.Null, JTokenType.Date, JTokenType.Bytes, JTokenType.Guid, JTokenType.Uri, JTokenType.TimeSpan };
List<JTokenType> propertyTypes = new List<JTokenType>(validPropertyValueTypes); JTokenType[] validObjectTypes = { JTokenType.String, JTokenType.Array, JTokenType.Object };
List<JTokenType> objectTypes = new List<JTokenType>(validObjectTypes); foreach (JProperty property in jObject_Properties)
{ try
{
if (propertyTypes.Contains(property.Value.Type))
{
ParseJsonKeyValue(property, property.Name.ToString());
}
else if (objectTypes.Contains(property.Value.Type))
{
//Arrays ex. { names: ["first": "John", "last" : "doe"]}
if (property.Value.Type == JTokenType.Array && property.Value.HasValues)
{
ParseJsonArray(property);
} //Objects ex. { name: "john"}
if (property.Value.Type == JTokenType.Object)
{
JObject jo = new JObject();
jo = JObject.Parse(property.Value.ToString());
string paramName = property.Name.ToString(); lst_KeyValueData.Add(paramName, property.Value.ToString()); if (jo.HasValues)
{
ParseJsonProperties(jo);
} }
}
}
catch (Exception ex)
{
throw;
}
} // End of ForEach } private static void ParseJsonKeyValue(JProperty item, string paramName)
{
lst_KeyValueData.Add(paramName, item.Value.ToString());
} private static void ParseJsonArray(JProperty item)
{
JArray jArray = (JArray)item.Value; string paramName = item.Name.ToString();
lst_KeyValueData.Add(paramName, item.Value.ToString()); try
{
for (int i = ; i < jArray.Count; i++)
{ paramName = i.ToString();
lst_KeyValueData.Add(paramName, jArray.Values().ElementAt(i).ToString()); JObject jo = new JObject();
jo = JObject.Parse(jArray[i].ToString());
IEnumerable<JProperty> jArrayEnum = jo.Properties(); foreach (JProperty jaItem in jArrayEnum)
{
var paramNameWithJaItem = jaItem.Name.ToString(); var itemValue = jaItem.Value.ToString(Formatting.None);
if (itemValue.Length > )
{
switch (itemValue.Substring(, ))
{
case "[":
//Recusion call to itself
ParseJsonArray(jaItem);
break;
case "{":
//Create a new JObject and parse
JObject joObject = new JObject();
joObject = JObject.Parse(itemValue); //For this value, reparse from the top
ParseJsonProperties(joObject);
break;
default:
ParseJsonKeyValue(jaItem, paramNameWithJaItem);
break;
}
}
}
} //end for loop }
catch (Exception ex)
{
throw;
}
}
}

json转换为键值对辅助类的更多相关文章

  1. C# 给枚举定义DescriptionAttribute,把枚举转换为键值对

    在C#中,枚举用来定状态值很方便,例如我定义一个叫做Season的枚举 public enum Season { Spring = 1, Summer = 2, Autumn = 3, Winter ...

  2. JSON创建键值对(key是中文或者数字)方式详解

    JSON创建键值对(key是中文或者数字)方式详解 先准备好一个空的json对象 var obj = {}; 1. 最原始的方法 obj.name = 'zhangsan'; //这种方式很简单的添加 ...

  3. 【C#基础】 读取json某个键值

    /// <summary> /// 用JSObject的方法获取json指定第一层某个键的值 /// </summary> /// <param name="j ...

  4. 把Javascript 对象转换为键值对连接符字符串的方法总结

    307down votefavorite 93 Do you know a fast and simple way to encode a Javascript Object into a strin ...

  5. 很傻很二很简单的一个问题,json键值为变量如何取值

    js里的json的键值是变量的话,那么传统的做法似乎不管用了. 例如: var json={'a':'123','b':'999'}    json.a得到123,如果a用变量表示呢,有笨法for循环 ...

  6. Visual Studio 2015 将json转换为实体类

    最新写的一个接口需要接收json参数,然后序列化为实体类然后再进行后面的逻辑处理.因为json中键值对比较多,逐一去手写实体中的每个属性太麻烦,于是寻思是否有这样的工具可以将json转换为实体类. 经 ...

  7. Learning Spark 第四章——键值对处理

    本章主要介绍Spark如何处理键值对.K-V RDDs通常用于聚集操作,使用相同的key聚集或者对不同的RDD进行聚集.部分情况下,需要将spark中的数据记录转换为键值对然后进行聚集处理.我们也会对 ...

  8. 利用FastJson,拼接复杂嵌套json数据&&直接从json字符串中(不依赖实体类)解析出键值对

    1.拼接复杂嵌套json FastJson工具包中有两主要的类: JSONObject和JSONArray ,前者表示json对象,后者表示json数组.他们两者都能添加Object类型的对象,但是J ...

  9. js循环json得到 键和值

    var jsondata=[{"男":4,"女":3,"不详":0},{"男one":23,"女two&quo ...

随机推荐

  1. CapsLock indicator on Ubuntu for Thinkpad

    http://askubuntu.com/questions/292535/how-to-get-caps-num-scroll-lock-keys-osd-notification sudo add ...

  2. NS CKD

    NS 定义:ALB<30:高脂血症:大量蛋白尿>3.5g:浮肿 见于:肾小球肾炎.小血管炎.微血管血栓性疾病.NSAIDs引起的急性间质性肾炎.不见于肾大血管病.间质性.小管性疾病. 并发 ...

  3. struts2校验器规范错误解决

    今天struts2的校验器的配置文件文件头出现了错误,配置如下: <!DOCTYPE validators PUBLIC        "-//OpenSymphony Group// ...

  4. oracle创建表空间,用户,授权等

    #oracle数据库安装完成后,有两个系统级的用户system 默认密码为 :managersys 默认密码为 :change_on_install #创建表空间tbs_xxxdba,初始大小1G,每 ...

  5. [每日一题] 11gOCP 1z0-052 :2013-09-2 ADDM(Automatic Database Diagnostic Monitor)...................A28

    转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/10951207 正确答案:BC AWR简称Automatic Workload Reposi ...

  6. [转] Linux Shell 文本处理工具集锦

    内容目录: find 文件查找 grep 文本搜索 xargs 命令行参数转换 sort 排序 uniq 消除重复行 用tr进行转换 cut 按列切分文本 paste 按列拼接文本 wc 统计行和字符 ...

  7. Ubuntu 11.10开启root用户登陆

    以管理员身份运行 #sudo gedit /etc/lightdm/lightdm.conf 将里面改成 "autologin-user=root" 就可以以root用户登录了

  8. 【转】C#注册快捷键

    转自:http://blog.csdn.net/xiahn1a/article/details/42561015 这里需要引用到“user32.dll”.对于Win32的API,调用起来还是需要dll ...

  9. 你好,C++(27)在一个函数内部调用它自己本身 5.1.5 函数的递归调用

    5.1.5 函数的递归调用 在函数调用中,通常我们都是在一个函数中调用另外一个函数,以此来完成其中的某部分功能.例如,我们在main()主函数中调用PowerSum()函数来计算两个数的平方和,而在P ...

  10. 2013 多校联合2 D Vases and Flowers (hdu 4614)

    Vases and Flowers Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others ...