using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using System.Linq;
namespace JsonTest
{
public delegate void MyDelegate(JObject s);
/// <summary>
/// 解析各种格式Json和委托的实现
/// </summary>
class Program
{
public Program()
{
#region Json E:\Json.txt内容
/*
{
"Sites": {"Site": [
{"id": "1","name": "测试教程","url": "www.runoob.com"},
{"id": "2","name": "测试工具","url": "c.runoob.com"},
{"id": "3","name": "测试Google","url": "www.google.com"},
{"id": "2","name": "菜鸟工具","url": "c.runoob.com"}
]},
"TextResult":"测试",
"ListResult":[
{"actionId":"1","actionAcount":"2","actionRewardType":"1"},
{"actionId":"2","actionAcount":"3","actionRewardType":"2"}
],
"ArrayResult":[ "Google", "Runoob", "Taobao" ]
}
字符串:{'Sites': {'Site': [{'id': '1','name': '测试教程','url': 'www.runoob.com'},{'id': '2','name': '测试工具','url': 'c.runoob.com'},{'id': '3','name': '测试Google','url': 'www.google.com'},{'id': '2','name': '菜鸟工具','url': 'c.runoob.com'}]},'TextResult':'测试','ListResult':[{'actionId':'1','actionAcount':'2','actionRewardType':'1'},{'actionId':'2','actionAcount':'3','actionRewardType':'2'}],'ArrayResult':[ 'Google', 'Runoob', 'Taobao' ]}
*/
#endregion
}
static async Task Main(string[] args)
{
using (StreamReader stream = new StreamReader(@"E:\Json.txt", System.Text.Encoding.UTF8))
{
JObject jsonObj = (JObject)JsonConvert.DeserializeObject(await stream.ReadToEndAsync());
MyDelegate myDelegate = SiteInfo;
myDelegate += ListResult;
myDelegate += StrArray;
myDelegate += Text;
if (myDelegate != null)
{
myDelegate(jsonObj);
}
_delegate(myDelegate);
Console.ReadKey();
}
}
public static void _delegate(MyDelegate my)
{
my -= Text;
my -= ListResult;
my -= StrArray;
my -= SiteInfo;
}
/// <summary>
/// 获取字符串
/// </summary>
/// <param name="jsonObj"></param>
/// <returns></returns>
public static void Text(JObject jsonObj)
{
Task.Run(() =>
{
string Text = jsonObj["TextResult"].ToString();
Console.WriteLine(Text);
});
}
/// <summary>
/// 转成List
/// </summary>
/// <param name="jsonObj"></param>
/// <returns></returns>
public static void ListResult(JObject jsonObj)
{
Task.Run(() =>
{
IEnumerable<ListResult> Listinfo = JsonConvert.DeserializeObject<List<ListResult>>(jsonObj["ListResult"].ToString());
foreach (ListResult item in Listinfo)
{
Console.WriteLine($"actionId:{item.actionId} actionAcount:{item.actionAcount} actionRewardType:{item.actionRewardType}");
}
});
}
/// <summary>
/// 转成数组
/// </summary>
/// <param name="jsonObj"></param>
/// <returns></returns>
public static void StrArray(JObject jsonObj)
{
Task.Run(() =>
{
string[] strArray = JsonConvert.DeserializeObject<string[]>(jsonObj["ArrayResult"].ToString());
for (int i = 0; i < strArray.Length; i++)
{
Console.WriteLine(strArray[i]);
}
});
}
/// <summary>
/// 转成List并去重
/// </summary>
/// <param name="jsonObj"></param>
/// <returns></returns>
public static void SiteInfo(JObject jsonObj)
{
Task.Run(() =>
{
JObject Sites = (JObject)JsonConvert.DeserializeObject(jsonObj["Sites"].ToString());
IEnumerable<Site> siteInfo = JsonConvert.DeserializeObject<List<Site>>(Sites["Site"].ToString());
foreach (Site item in siteInfo)
{
Console.WriteLine($"id:{item.id} name:{item.name} url:{item.url}");
}
//去重
CustomerPhoneCompare compare = new();
//再转回集合
IEnumerable<Site> customerPhoneListResult = siteInfo.Distinct(compare);
//输出
foreach (Site item in customerPhoneListResult.ToList())
{
Console.WriteLine($"id:{item.id} name:{item.name} url:{item.url} 去重后");
}
});
}
}
class ListResult
{
public ListResult(dynamic ActionId, dynamic ActionAcount, dynamic ActionRewardType)
=> (actionId, actionAcount, actionRewardType) = (ActionId, ActionAcount, ActionRewardType);
public dynamic actionId { get; set; }
public dynamic actionAcount { get; set; }
public dynamic actionRewardType { get; set; }
}
class Site
{
public Site(dynamic ID, dynamic Name, dynamic Url)
=> (id, name, url) = (ID, Name, Url);
public dynamic id { get; set; }
public dynamic name { get; set; }
public dynamic url { get; set; }
}
/// <summary>
/// 去重
/// </summary>
class CustomerPhoneCompare : IEqualityComparer<Site>
{
public bool Equals(Site x, Site y)
{
return x.id == y.id; //可以根据某个属性定制去重条件
}
public int GetHashCode(Site obj) //此方法必须有,作用?
{
return obj.ToString().ToLower().GetHashCode();
}
}
}
.Net 解析Json转为集合和数组
于 2022-09-26 22:40:43 首次发布