ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C# 解析json字符串不创建新类{新的实体对象}

2022-04-03 21:03:35  阅读:304  来源: 互联网

标签:jsonStr string C# 新类 Json json Hashtable 字符串 解析


来源:(47条消息) C#使用Newtonsoft不创建实体对象解析Json字符串_牛奶咖啡13的博客-CSDN博客

一、使用Newtonsoft不创建实体对象解析Json字符串的示例演示

1.1、首先需要引用命名空间

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Collections;//Hashtable所需的命名空间
1.2、解析首尾不带中括号[]的Json字符串

1.2.1、核心的解析方法如下

/// <summary>
/// 解析Json字符串(首尾没有中括号)【线程安全】
/// </summary>
/// <param name="jsonStr">需要解析的Json字符串</param>
/// <returns>返回解析好的Hashtable表</returns>
private static Hashtable AnalayJsonString(string jsonStr)
{
Hashtable ht = new Hashtable();
if (!string.IsNullOrEmpty(jsonStr))
{
JObject jo = (JObject)JsonConvert.DeserializeObject(jsonStr);
foreach (var item in jo)
{
ht.Add(item.Key,item.Value);
}
}

return ht;
}
1.2.2、调用示例1如下:

string strTmp = "{\"10101\":\"北京\",\"10102\":\"上海\"}";
Hashtable ht = AnalayJsonString(strTmp);
foreach (DictionaryEntry item in ht)
{
Console.WriteLine(item.Key + " " + item.Value);
}
1.2.3、解析示例1结果如下:

 

 


1.2.4、调用示例2如下:

string jsonText = "{\"beijing\":{\"zone\":\"海淀\",\"zone_en\":\"haidian\"},\"shanghai\":{\"zone\":\"浦东\",\"zone_en\":\"pudong\"}}";
Hashtable ht = AnalayJsonString(jsonText);
foreach (DictionaryEntry item in ht)
{
Console.WriteLine(item.Key);
Hashtable ht2 = AnalayJsonString(item.Value.ToString());
foreach (DictionaryEntry item2 in ht2)
{
Console.WriteLine(" "+item2.Key + " " + item2.Value);
}
}
1.2.5、解析示例2结果如下:

 

 

 

1.2.6、解析指定键对应的值

①核心解析方法如下:

/// <summary>
/// 解析Json字符串为JObject(首尾没有中括号)
/// </summary>
/// <param name="jsonStr">需要解析的Json字符串</param>
/// <returns>返回解析后的JObject对象</returns>
private static JObject AnalayJsonStringToObj(string jsonStr)
{
if (!string.IsNullOrEmpty(jsonStr))
{
string strJsonIndex = string.Empty;
JObject jo = (JObject)JsonConvert.DeserializeObject(jsonStr);
return jo;
}
else
{
return null;
}
}
②解析示例1如下:

static void Main(string[] args)
{
string jsonText = "{\"10101\":\"北京\",\"10102\":\"上海\"}";
JObject strTmp = AnalayJsonStringToObj(jsonText);
Console.WriteLine("---解析结果为---"+strTmp["10101"]);

Console.ReadLine();
}
③运行示例1结果如下:

 

 

 

④解析示例2如下:

static void Main(string[] args)
{
string jsonText = "{\"beijing\":{\"zone\":\"海淀\",\"zone_en\":\"haidian\"},\"shanghai\":{\"zone\":\"浦东\",\"zone_en\":\"pudong\"}}";
JObject strTmp = AnalayJsonStringToObj(jsonText);
Console.WriteLine("---解析结果为---"+strTmp["beijing"]["zone"]);

Console.ReadLine();
}
⑤运行示例2结果如下:

 

 

 

 

 

 

1.3、解析首不带中括号[]的Json字符串

1.3.1、首先去除该Json字符串的首尾中括号,然后采用【1.2、解析首尾不带中括号[]的Json字符串】方法解析

static void Main(string[] args)
{
string strTmp = "[{\"10101\":\"北京\",\"10102\":\"上海\"}]";
//提取字符串中中括号里面的内容
string strHanle = NumberOrStringOPC.GetBracketsContents(strTmp,1);
//解析不带中括号Json字符串
Hashtable ht = AnalayJsonString(strHanle);
foreach (DictionaryEntry item in ht)
{
Console.WriteLine(item.Key + " " + item.Value);
}
Console.WriteLine("---------解析完成-------------");

Console.ReadLine();
}

/// <summary>
/// 解析Json字符串(首尾没有中括号)
/// </summary>
/// <param name="jsonStr">需要解析的Json字符串</param>
/// <returns>返回解析好的Hashtable表</returns>
private static Hashtable AnalayJsonString(string jsonStr)
{
Hashtable ht = new Hashtable();
if (!string.IsNullOrEmpty(jsonStr))
{
JObject jo = (JObject)JsonConvert.DeserializeObject(jsonStr);
foreach (var item in jo)
{
ht.Add(item.Key,item.Value);
}
}

return ht;
}

class NumberOrStringOPC
{
#region 提取括号里面的内容
/// <summary>
/// 提取小括号、中括号、大括号里面的字符串内容
/// </summary>
/// <param name="strNeedOPC">需要处理的字符串</param>
/// <param name="bracketsType">括号的类型【0表示小括号1表示中括号2表示大括号】</param>
/// <returns></returns>
public static string GetBracketsContents(string strNeedOPC,int bracketsType=0)
{
string strTmp = string.Empty;
if (!string.IsNullOrEmpty(strNeedOPC))
{
switch (bracketsType)
{
case 0:
strTmp = Regex.Replace(strNeedOPC, @"(.*\()(.*)(\).*)", "$2");//获取小括号()里面的内容
break;
case 1:
Regex rex = new Regex(@"(?i)(?<=\[)(.*)(?=\])");//获取中括号[]里面的内容正则规则
strTmp = rex.Match(strNeedOPC).Value;
break;
case 2:
strTmp= Regex.Match(strNeedOPC, @"\{(.*)\}", RegexOptions.Singleline).Groups[1].Value;//获取大括号{}里面的内容
break;
default:
break;
}
}

return strTmp;
}

#endregion
}
运行结果如下:

 

 

 

1.3.2、直接进行解析

核心解析方法

/// <summary>
/// 解析Json字符串(首尾有中括号)【线程安全】
/// </summary>
/// <param name="jsonStr">需要解析的Json字符串</param>
/// <returns>返回解析好的Hashtable表</returns>
private static Hashtable AnalayJsonStringMiddleBrackets(string jsonStr)
{
Hashtable ht = new Hashtable();
if (!string.IsNullOrEmpty(jsonStr))
{
JArray jArray = (JArray)JsonConvert.DeserializeObject(jsonStr);//jsonArrayText必须是带[]字符串数组
if (jArray != null && jArray.Count > 0)
{
foreach (var item in jArray)
{
foreach (JToken jToken in item)
{
string[] strTmp = jToken.ToString().Split(':');
ht.Add(strTmp[0].Replace("\"", ""), strTmp[1].Replace("\"", ""));
}
}
}
}
return ht;
}
解析示例

static void Main(string[] args)
{
string strTmp = "[{\"10101\":\"北京\",\"10102\":\"上海\"}]";

//解析带中括号Json字符串
Hashtable ht = AnalayJsonStringMiddleBrackets(strTmp);
foreach (DictionaryEntry item in ht)
{
Console.WriteLine(item.Key + " " + item.Value);
}
Console.WriteLine("---------解析完成-------------");

Console.ReadLine();
}

运行结果如下:

 

 


1.3.3、解析指定键对应的值

①核心方法如下:

/// <summary>
/// 解析Json字符串为JArray(首尾有中括号)
/// </summary>
/// <param name="jsonStr">需要解析的Json字符串</param>
/// <returns>返回解析后的JArray对象</returns>
private static JArray AnalayJsonStringToJArray(string jsonStr)
{
if (!string.IsNullOrEmpty(jsonStr))
{
string strJsonIndex = string.Empty;
JArray ja = (JArray)JsonConvert.DeserializeObject(jsonStr);
return ja;
}
else
{
return null;
}
}
②解析示例如下:

static void Main(string[] args)
{
string jsonText = "[{\"10101\":\"北京\",\"10102\":\"上海\"}]";
JArray strTmp = AnalayJsonStringToJArray(jsonText);
Console.WriteLine("---解析结果为---"+strTmp[0]["10101"]);

Console.ReadLine();
}
③运行结果如下:

 

 

 

 

二、使用Newtonsoft不创建实体对象解析Json字符串的通用类

注意:需要引用Newtonsoft.dll

其中Newtonsoft.dll库的官方下载链接为:微软官方指定Newtonsoft库下载地址


using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Collections;

class AnalayJson
{
#region 解析Json字符串(首尾没有中括号)
/// <summary>
/// 解析Json字符串(首尾没有中括号)【线程安全】
/// </summary>
/// <param name="jsonStr">需要解析的Json字符串</param>
/// <returns>返回解析好的Hashtable表</returns>
public static Hashtable AnalayJsonString(string jsonStr)
{
Hashtable ht = new Hashtable();
if (!string.IsNullOrEmpty(jsonStr))
{
JObject jo = (JObject)JsonConvert.DeserializeObject(jsonStr);
foreach (var item in jo)
{
ht.Add(item.Key, item.Value);
}
}

return ht;
}

/// <summary>
/// 解析Json字符串为JObject(首尾没有中括号)
/// </summary>
/// <param name="jsonStr">需要解析的Json字符串</param>
/// <returns>返回解析后的JObject对象</returns>
public static JObject AnalayJsonStringToJObject(string jsonStr)
{
if (!string.IsNullOrEmpty(jsonStr))
{
string strJsonIndex = string.Empty;
JObject jo = (JObject)JsonConvert.DeserializeObject(jsonStr);
return jo;
}
else
{
return null;
}
}

#endregion

#region 解析Json字符串(首尾有中括号)

/// <summary>
/// 解析Json字符串(首尾有中括号)【线程安全】
/// </summary>
/// <param name="jsonStr">需要解析的Json字符串</param>
/// <returns>返回解析好的Hashtable表</returns>
public static Hashtable AnalayJsonStringMiddleBrackets(string jsonStr)
{
Hashtable ht = new Hashtable();
if (!string.IsNullOrEmpty(jsonStr))
{
JArray jArray = (JArray)JsonConvert.DeserializeObject(jsonStr);//jsonArrayText必须是带[]字符串数组
if (jArray != null && jArray.Count > 0)
{
foreach (var item in jArray)
{
foreach (JToken jToken in item)
{
string[] strTmp = jToken.ToString().Split(':');
ht.Add(strTmp[0].Replace("\"", ""), strTmp[1].Replace("\"", ""));
}
}
}
}
return ht;
}

/// <summary>
/// 解析Json字符串为JArray(首尾有中括号)
/// </summary>
/// <param name="jsonStr">需要解析的Json字符串</param>
/// <returns>返回解析后的JArray对象</returns>
public static JArray AnalayJsonStringMiddleBracketsToJArray(string jsonStr)
{
if (!string.IsNullOrEmpty(jsonStr))
{
string strJsonIndex = string.Empty;
JArray ja = (JArray)JsonConvert.DeserializeObject(jsonStr);
return ja;
}
else
{
return null;
}
}

#endregion
}

标签:jsonStr,string,C#,新类,Json,json,Hashtable,字符串,解析
来源: https://www.cnblogs.com/smartisn/p/16097297.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有