安装Json包:
参考微软文档:
https://docs.microsoft.com/zh-cn/nuget/consume-packages/install-use-packages-visual-studio
再添加引用
using Newtonsoft.Json;
安装LitJson包:
使用JsonMapper和StreamWriter要使用LitJson,引用和Json包类似,还需要引用
using LitJson;
例句:
string json = JsonMapper.ToJson(user);//需要引用头文件using LitJson;需要在引用中添加LitJson参考引用Newtonsoft.Json
StreamWriter sw = new StreamWriter(strPath);//需要引用头文件using LitJson;
sw.Write(json);
sw.Close();
使用JObject:
需要引用Newtonsoft.Json的dll和using Newtonsoft.Json.Linq的命名空间。LINQ to JSON主要使用到JObject, JArray, JProperty和JValue这四个对象。
示例代码:
参考这个博客https://blog.csdn.net/qq_41721686/article/details/103256037
但是这个博客上有好多的错误,本人修正后运行通过把代码写本文中。本文的运行环境是win10 64位系统,编译环境是VS2015.
创建json代码和修改json
using Newtonsoft.Json;
using System;
using System.IO;
using LitJson;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
namespace ConsoleJsonTest
{
class Program
{
public class User
{
public string UserName { get; set; }
public string PassWord { get; set; }
}
public class Create
{
/*
* 新建Json
* <param name = "strPath">新建的位置</param>
* <param name = "user">对象</param>
*/
public static void CreateJson(string strPath, User user)
{
string json = JsonMapper.ToJson(user);//需要引用头文件using LitJson;需要在引用中添加LitJson参考引用Newtonsoft.Json
StreamWriter sw = new StreamWriter(strPath);//需要引用头文件using LitJson;
sw.Write(json);
sw.Close();
}
/*
* 修改Json
* <param name = "strpath">Json文件所在的位置</param>
*
*/
public static void EditJson(string strpath)
{
string strJson = File.ReadAllText(strpath, Encoding.UTF8);
JObject oJson = JObject.Parse(strJson);//using Newtonsoft.Json.Linq
oJson["UserName"] = "Mello";
oJson["PassWord"] = "123456";
string strConvert = Convert.ToString(oJson);//将json转换为string
File.WriteAllText(strpath, strConvert);//将内容写进json文件中
}
/*
* 读取Json
* <param name = "strpath">文件所在的位置</param>
*/
public static User ReadJson(string strPath)
{
User user = new User();
using (StreamReader readFile = File.OpenText(strPath))
{
using (JsonTextReader reader = new JsonTextReader(readFile))//using Newtonsoft.Json
{
JObject oJson = (JObject)JToken.ReadFrom(reader);
user.UserName = oJson["UserName"].ToString();
user.PassWord = oJson["PassWord"].ToString();
}
}
return user;
}
}
static void Main(string[] args)
{
User user = new User();
user.UserName = "qwe";
user.PassWord = "123";
Create creat = new Create();
Create.CreateJson("./name.json",user);
Create.EditJson("./name.json");
user = Create.ReadJson("./name.json");
Console.WriteLine(user.UserName+user.PassWord);
}
}
}
结果:
自己运行吧。
第二种方法:
示例代码:
using Newtonsoft.Json;
using System;
using System.IO;
using LitJson;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
namespace JsonTest2
{
class Json2
{
class JSONtest
{
public class Skll
{
public string Q { get; set; }
public string W { get; set; }
public string E { get; set; }
public string R { get; set; }
}
public class Item
{
public string iChi { get; set; }
public string ni { get; set; }
public string san { get; set; }
public string yon { get; set; }
}
public class Cyapion
{
public string CyapionName { get; set; }
public Skll skll { get; set; }
public Item item { get; set; }
}
/*
* 新建Json
* <param name= "strPath">新建的位置</param>
* <param name = "listApc">Json字符串内容</param>
*/
public static void CreateJson(string strPath, List<Cyapion> listCypoin)
{
Cyapion cyapion = new Cyapion();
Skll skll = new Skll();
Item item = new Item();
cyapion.CyapionName = null;
cyapion.skll = skll;
cyapion.item = item;
string json = JsonMapper.ToJson(cyapion);
StreamWriter sw = new StreamWriter(strPath);
sw.Write(json);
sw.Close();
// 如果使用listCyapoin写入的会是: [{"cyapionName":null,"skll":{"skllQ":null,"skllW":null,"skllE":null,"skllR":null},"item":{"itemQ":null,"itemW":null,"itemE":null,"itemR":null}}]
// 如果使用cyapion写入的会是: {"cyapionName":null,"skll":{"skllQ":null,"skllW":null,"skllE":null,"skllR":null},"item":{"itemQ":null,"itemW":null,"itemE":null,"itemR":null}}
}
/*
* 修改Json
* <param name = "strPath">Json文件所在的位置</param>
*/
public static void EditJson(string strPath)
{
string strJson = File.ReadAllText(strPath, Encoding.UTF8);
if (strJson.Contains("[") && strJson.Contains("]"))
{
strJson = strJson.Substring(1);
strJson = strJson.Substring(0, strJson.Length - 1);
}
JObject OJson = JObject.Parse(strJson);
OJson["CyapionName"] = "Karma";
OJson["skll"]["Q"] = "Kok";
OJson["skll"]["W"] = "www";
OJson["skll"]["E"] = "eee";
OJson["skll"]["R"] = "rrr";
OJson["item"]["iChi"] = "iChi";
OJson["item"]["ni"] = "ni";
OJson["item"]["san"] = "san";
OJson["item"]["yon"] = "yon";
string strConvert = Convert.ToString(OJson);
File.WriteAllText(strPath, strConvert);
}
public static Cyapion ReadJson(string strPath)
{
Cyapion cyapion = new Cyapion();
using (StreamReader readFile = File.OpenText(strPath))
{
using (JsonTextReader reader = new JsonTextReader(readFile))
{
JToken jTken = JToken.ReadFrom(reader);
JObject oJson = new JObject();
if (jTken.Type == JTokenType.Array)
{
oJson = (JObject)jTken.Last;
}
else if (jTken.Type == JTokenType.Object)
{
oJson = (JObject)jTken;
}
cyapion.CyapionName = oJson["CyapionName"].ToString();
cyapion.skll.Q = oJson["Skll"]["Q"].ToString();
cyapion.skll.W = oJson["Skll"]["W"].ToString();
cyapion.skll.E = oJson["Skll"]["E"].ToString();
cyapion.skll.R = oJson["Skll"]["R"].ToString();
cyapion.item.iChi = oJson["Item"]["iChi"].ToString();
cyapion.item.ni = oJson["Item"]["ni"].ToString();
cyapion.item.san = oJson["Item"]["san"].ToString();
cyapion.item.yon = oJson["Item"]["yon"].ToString();
}
}
return cyapion;
}
}
static void Main(string[] args)
{
JSONtest js = new JSONtest();
List<JSONtest.Cyapion> wps = new List<JSONtest.Cyapion>();
JSONtest.CreateJson("./qsx.json", wps);
JSONtest.EditJson("./qsx.json");
}
}
}
结果:
自己跑。
-----------------------------------------------2020.07.31更新一个简单的json编写方法--------------------------------------------------------------------
这样写的代码可以添加List<object> 容器。上面的代码试了无数次都不行,有知道的同学可以留言。
先上代码:
var req = new AGVRW() { reqName = "opMaterial",reqID = "xxxxxxx",timestamp = strFu };
req.content = new AGVRW.Content() { type = 0,MRID = "MR01",eqpID = "MT01",material = new List<AGVRW.Material>() { new AGVRW.Material() { material = material1} } };
var jStr = JsonConvert.SerializeObject(req);
string AGVRWstrConvert1 = Convert.ToString(jStr);
JObject AGVRWOJson = JObject.Parse(AGVRWstrjson);
其中json的类跟上面的一样
public class AGVRW
{
public class Content
{
public int type { get; set; }
public string MRID { get; set; }
public string eqpID { get; set; }
public List<Material> material { get; set; }
}
public class Material
{
public List<object> material { get; set; }
}
public string reqName { get; set; }
public string reqID { get; set; }
public Content content { get; set; }
public string timestamp { get; set; }
}
这样的出的字符串跟上面的一样,但是是一长串,不是文本形式的。这样的适用于通信。
------------------------------------20200804---------------------------------------------------------
解析json文件
这个简单,直接上代码了
public void parseJson(string M,string h)
{
JObject j = (JObject)JsonConvert.DeserializeObject(M);
string r = jAGV["r"].ToString();
JObject jh= (JObject)JsonConvert.DeserializeObject(h);
string c = jhost["c"].ToString();
int co = int.Parse(c);
string m = jhost["m"].ToString();
string r = jhost["r"].ToString();
string st = jhost["c"]["st"].ToString();
int sta= int.Parse(st);
string time = jhost["time"].ToString();
}
-------------------20200820-----------------------------------解析json字符串------------------------------------
以上方法是编辑json字符串,以下方法是解析json字符串。
代码
JObject jhost = (JObject)JsonConvert.DeserializeObject(parJson.hostJsonString);
string codestr = jhost["code"].ToString();
int code = int.Parse(codestr);
string reqIDHost = jhost["reqID"].ToString();
第一行代码的意思就是把parJson.hostJsonString这个字符串转换成jobject字符串。jobject可以理解为中间值。
第二行代码就是C#的字符串。jhost["code"]是json文件中“code”中的字符。ToString可以直接转换成String型。
第三行代码是把string转换成int型。
这种是比较简单的了,也可以写个类,和创建json一样可以直接读。
要是读json全部的内容类比较合适,这种的适合只需要json 部分内容。
List<ArrayList> HostMatrial = new List<ArrayList>();
foreach (var item in jhost["content"]["material"].Children())
{
HostMatrial.Add(item.ToObject<ArrayList>());
}
for (int i = 0; i < HostMatrial.Count; ++i)
{
for (int j = 0; j < HostMatrial[i].Count; ++j)
{
var a = HostMatrial[i][j];
}
}
这里有个重点就是.children()这个方法,这是我的json字符串中有一个List<ArrayList>的数据,我需要把json的格式转换成普通格式,就这个我弄了一下午。按这个是没问题的,要是直接写类就没这种问题了,我太懒了,就没写。折腾了好久。
关于类的我就不写了,只要格式和json对应好就问题不大。