JsonHelper.cs
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
namespace JsonTest
{//原创来自:http://www.luofenming.com/show.aspx?id=ART2019091500001
Public class JsonHelper
{
private string _path;//根目录的相对途径
/// <summary>
///
/// </summary>
/// <param name="jsonName">根目录的相对途径包含文件名</param>
public JsonHelper(string jsonName)
{
if (!jsonName.EndsWith(".json"))
{
_path = $"{jsonName}.json";
}
else
{
_path = jsonName;
}
if (!File.Exists(_path))
{//不存在 创建一个json文件
File.WriteAllText(_path, "{}");
}
}
/// <summary>
/// 读取Json返回实体对象
/// </summary>
/// <returns></returns>
public T Read<T>() => Read<T>("");
/// <summary>
/// 根据节点读取Json返回实体对象
/// </summary>
/// <param name="section">根节点</param>
/// <returns></returns>
public T Read<T>(string section)
{
try
{
using (StreamReader file = new StreamReader(_path))
using (JsonTextReader reader = new JsonTextReader(file))
{
JToken secJt = JToken.ReadFrom(reader);
if (!string.IsNullOrWhiteSpace(section))
{//jObj[section].SelectToken("address").SelectToken("name")
string[] nodes = section.Split(':');
foreach (string node in nodes)
{
secJt = secJt[node];
}
if (secJt != null)
{
return JsonConvert.DeserializeObject<T>(secJt.ToString());
}
}
else
{
return JsonConvert.DeserializeObject<T>(secJt.ToString());
}
}
}
catch (System.Exception ex)
{
throw ex;
}
return default(T);
}
/// <summary>
/// 读取Json返回集合
/// </summary>
/// <returns></returns>
public List<T> ReadList<T>() => ReadList<T>("");
/// <summary>
/// 根据节点读取Json返回集合
/// </summary>
/// <param name="section">根节点</param>
/// <returns></returns>
public List<T> ReadList<T>(string section)
{
try
{
using (StreamReader file = new StreamReader(_path))
{
using (JsonTextReader reader = new JsonTextReader(file))
{
JToken secJt = JToken.ReadFrom(reader);
if (!string.IsNullOrWhiteSpace(section))
{
string[] nodes = section.Split(':');
foreach (string node in nodes)
{
secJt = secJt[node];
}
if (secJt != null)
{
return JsonConvert.DeserializeObject<List<T>>(secJt.ToString());
}
}
else
{
return JsonConvert.DeserializeObject<List<T>>(section.ToString());
}
}
}
}
catch (System.Exception ex)
{
throw ex;
}
return default(List<T>);
}
/// <summary>
/// 写入文件
/// </summary>
/// <typeparam name="T">自定义对象</typeparam>
/// <param name="t"></param>
public void Write<T>(T t) => Write("", t);
/// <summary>
/// 写入指定section文件
/// </summary>
/// <typeparam name="T">自定义对象</typeparam>
/// <param name="t"></param>
public void Write<T>(string section, T t)
{
try
{
JObject jObj;
string json = JsonConvert.SerializeObject(t);
if (string.IsNullOrWhiteSpace(section))
{
jObj = JObject.Parse(json);
}
else
{
using (StreamReader file = new StreamReader(_path))
using (JsonTextReader reader = new JsonTextReader(file))
{
try
{
jObj = (JObject)JToken.ReadFrom(reader);
jObj[section] = JObject.Parse(json);
}
catch (Exception ex)
{
jObj = JObject.Parse(json);
}
}
}
using (StreamWriter writer = new StreamWriter(_path))
{
using (JsonTextWriter jsonWriter = new JsonTextWriter(writer))
{
jObj.WriteTo(jsonWriter);
}
}
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 删除或修改 单个节点
/// </summary>
/// <param name="section">节点途径 格式为A:B:C 如果节点带数组格式 A:[0]:C 数组用中括号</param>
/// <param name="isRemove">是删除还是修改</param>
/// <param name="value">修改节点的内容</param>
/// <param name="isNum">修改内容类型 数据:true 字符串:false</param>
private void JTokenHander(string section, bool isRemove, string value, bool isNum)
{
try
{
JToken jObj;
using (StreamReader file = new StreamReader(_path))
{
using (JsonTextReader reader = new JsonTextReader(file))
{
jObj = JToken.ReadFrom(reader);
string[] nodes = section.Split(':');
JToken tempToken = jObj;
if (nodes != null && nodes.Length > 0)
{
foreach (string node in nodes)
{
if (node != null)
{
if (node.StartsWith("[") && node.EndsWith("]"))
{
int tempi = 0;
if (int.TryParse(node.Trim('[').Trim(']'), out tempi))
{
tempToken = tempToken[tempi];
}
}
else
{
tempToken = tempToken[node];
}
}
else
{
break;
}
}
}
if (tempToken != null)
{
if (isRemove)
{
tempToken.Parent.Remove();
}
else
{
JToken token;
if (isNum)
{
if (value.Contains("."))
{
double tempd;
double.TryParse(value, out tempd);
token = tempd;
}
else
{
int tempi = 0;
int.TryParse(value, out tempi);
token = tempi;
}
}
else
{
token = value;
}
tempToken.Replace(token);//改
}
}
}
}
using (StreamWriter writer = new StreamWriter(_path))
{
using (JsonTextWriter jsonWriter = new JsonTextWriter(writer))
{
jObj.WriteTo(jsonWriter);
}
}
}
catch (System.Exception ex)
{
throw ex;
}
}
/// <summary>
/// 删除指定节点
/// </summary>
/// <param name="section">节点途径 格式为A:B:C 如果节点带数组格式 A:[0]:C 数组用中括号</param>
public void Remove(string section)
{
JTokenHander(section, true, "", false);
}
/// <summary>
/// 修改指定节点内容
/// </summary>
/// <param name="section">节点途径 格式为A:B:C 如果节点带数组格式 A:[0]:C 数组用中括号</param>
/// <param name="value">修改节点的内容</param>
/// <param name="isNum">修改内容类型 数据:true 字符串:false</param>
public void Update(string section, string value, bool isNum)
{
JTokenHander(section, false, value, isNum);
}
/// <summary>
/// 读取节点内容
/// </summary>
/// <param name="section">节点途径 格式为A:B:C 如果节点带数组格式 A:[0]:C 数组用中括号</param>
/// <returns></returns>
public string Read(string section)
{
try
{
JToken jObj;
using (StreamReader file = new StreamReader(_path))
{
using (JsonTextReader reader = new JsonTextReader(file))
{
jObj = JToken.ReadFrom(reader);
string[] nodes = section.Split(':');
JToken tempToken = jObj;
if (nodes != null && nodes.Length > 0)
{
foreach (string node in nodes)
{
if (node != null)
{
if (node.StartsWith("[") && node.EndsWith("]"))
{
int tempi = 0;
if (int.TryParse(node, out tempi))
{
tempToken = tempToken[tempi];
}
}
else
{
tempToken = tempToken[node];
}
}
else
{
break;
}
}
}
if (tempToken != null)
{
return tempToken.ToString();
}
}
}
}
catch (System.Exception ex)
{
throw ex;
}
return "";
}
}
}
Model实体类
public class DataModel
{
public int errorcode { get; set; }
public string message { get; set; }
public Person person { get; set; }
}
public class Person
{
public int id { get; set; }
public string name { get; set; }
public string age { get; set; }
public string sex { get; set; }
public Address address { get; set; }
}
public class Address
{
public string name { get; set; }
public string postcode { get; set; }
}
JsonDemo.json 内容
{
"errorcode": 0,
"message": "lqwvje",
"person": {
"id": 1,
"name": "罗分明",
"age": 18,
"sex": "男",
"address": {
"name": "江西九江",
"postcode": "332600"
},
"listData": [ "ad", "asdf", "23" ]
}
}
方法调用 注意如果读取不到,看生成的根目录有没有JsonDemo.json 这个文件 并且有上面Json内容
static void Test()
{
JsonHelper jsonFileHelper = new JsonHelper("JsonDemo.json");
//Address person = jsonFileHelper.Read<Address>("person:address");//获取json实内容
#region 修改json
//DataModel dataModel = jsonFileHelper.Read<DataModel>();//获取Json实体内容
//dataModel.person.name = "luofenming";//修改实体内容
//jsonFileHelper.Write<DataModel>(dataModel);//写入实体内容
#endregion
//string s = jsonFileHelper.ReadSingleNode("person:id");//查询单个节点值
//string s2 = jsonFileHelper.ReadSingleNode("person:address:postcode");//查询单个节点值
//List<string> list = jsonFileHelper.ReadList<string>("person:listData");//查询数组
//jsonFileHelper.Remove("person:address");//删除节点
}