在原来解析 json 数据是,一般都是用反序列化来实现json数据的解读,这需要首先知道json数据的结构并且建立相应的类才能反序列化,一旦遇到动态的 json 数据,这种方法就不使用。 为了解决动态解析json数据,微软有个 Newtonsoft.Json 封装类十分好用,里面的 JToken 直接实现对JSON的增删改查。

JToken 的层次结构是这样的:

JToken -抽象基类
JContainer - 能够包含其它 JToken JToken 抽象基类
JArray - 表示一个JSON数组(包含一个有序的List)
JObeject - 表示一个JSON对象(包含一个 IEnumerable
JProperty - 表示一个JSON属性(在 JObject 中是一个 name/JToken 键值对)
JValue - 表示一个原生JSON值( string,number,boolean,null )

增删改查:

var cardJson = "['身份证','银行卡','门禁卡']";
            var cardJArray = JArray.Parse(cardJson);
            var p = new Person { Name="fan",Age=12,Dog=new Dog { Name="奶牛"} };
        JObject jobj= JObject.FromObject(p);
//添加属性
            jobj["NickName"] = "fan";
            jobj["Wifes"] = new JArray("rose", "lisa");
            ((JArray)jobj["Wifes"]).Add( "july");
            jobj["Cards"] = cardJArray;
            //修改属性
            jobj["Name"] = "li";
            jobj["Age"] = 9;
            jobj["Dog"]["Name"] = "阿黄";
            ((JArray)jobj["Wifes"])[0] = "roses";
            //插入属性
            jobj.Property("Name").AddBeforeSelf(new JProperty("ID", 1));
            //删除属性
            jobj.Property("Age").Remove();
            ((JArray)jobj["Wifes"])[2].Remove();
            //遍历属性
            var props = jobj.Children().Values();
            foreach (var prop in props)
                if (!(prop is JObject) && !(prop is JArray))
                    Console.WriteLine(prop.ToString());
            //遍历数组
            var cardList = ((JArray)jobj["Cards"]);
            foreach (var card in cardList)
                Console.WriteLine(card.ToString());
            //强类型读取
            Console.WriteLine(jobj.Value<int>("ID")); 
            var p2 = jobj.ToString();

使用集合初始化语法:

            JObject o = new JObject 
                {"CPU","Intel"},
                {"Memory",2048},
                    "Drives",new JArray
                        "DVD",
            Console.WriteLine(o.ToString());

使用dynamic初始化:

dynamic address = new JObject();
            address.Province = "beijing";
            address.City = "beijing";
            address.County = "zhongguo";
            address.Villages = new JArray("aa", "bb");
            Console.WriteLine(address.ToString());

使用JTokenWriter初始化:

            JTokenWriter writer = new JTokenWriter();
            writer.WriteStartObject();
            writer.WritePropertyName("Title");
            writer.WriteValue("aaaaaaa???");
            writer.WritePropertyName("Detail");   
            writer.WriteStartArray();
            writer.WriteValue("Yes");
            writer.WriteValue("No");
            writer.WriteValue("Unknown");
            writer.WriteEndArray();
            writer.WriteEndObject();
            JObject o = (JObject)writer.Token;
            Console.WriteLine(o.ToString());

使用.NET值初始化:

            JValue i = (JValue)JToken.FromObject(123);
            Console.WriteLine(i.Type);
            Console.WriteLine(i.ToString());
            JValue s = (JValue)JToken.FromObject("GongHui");
            Console.WriteLine(s.Type);
            Console.WriteLine(s.ToString());
            Address address = new Address
                City = "GuangZhou",
                Province = "GuangDong",
                County = "ShiQiao",
                Villages = new List<string>
                    "111",
                    "222"
            JObject o = (JObject)JToken.FromObject(address);
            Console.WriteLine(o.ToString());

遍历JSON属性:

/// <summary>
/// 遍历所以节点,替换其中某个节点的值
/// </summary>
/// <param name="jobj">json数据</param>
/// <param name="nodeName">节点名</param>
/// <param name="value">新值</param>
private static void JSON_SetChildNodes(ref JToken jobj, string nodeName, string value)
        JToken result = jobj as JToken;//转换为JToken
        JToken result2 = result.DeepClone();//复制一个返回值,由于遍历的时候JToken的修改会终止遍历,因此需要复制一个新的返回json
        var reader = result.CreateReader();
        while (reader.Read())
            if (reader.Value != null)
                if (reader.TokenType == JsonToken.String || reader.TokenType == JsonToken.Integer || reader.TokenType == JsonToken.Float)
                    Regex reg = new Regex(@"" + nodeName + "$");
                    //SelectToken(Path)方法可查找某路径下的节点,在Newtonsoft.Json 4.5 版本中不可使用正则匹配,在6.0版本中可用使用,会方便很多,6.0版本下替换值会更方便,这个需要特别注意的
                    if (reg.IsMatch(reader.Path))
                        result2.SelectToken(reader.Path).Replace(value);
        jobj = result2;
    catch (Exception ex)

手动创建JObject

var json = new JObject(
        new JProperty("status", result.Status.ToString()),
        new JProperty("results", new JObject(result.Entries.Select(pair =>
            new JProperty(pair.Key, new JObject(
                new JProperty("status", pair.Value.Status.ToString()),
                new JProperty("description", pair.Value.Description),
                new JProperty("data", new JObject(pair.Value.Data.Select(
                    p => new JProperty(p.Key, p.Value))))))))));
var str = json.ToString();

JToken合并:

需要引一个Nuget包:MassTransit

添加引用:using MassTransit.Courier.Serialization;

jObj.Merge(JObject.Parse(userTranslate.ValueJSON));

JToken查找:

jObject.SelectToken($".{path}");//根据路径查找

ObjectJToken

JToken.FromObject(object)

JTokenObject

jObj.ToObject<List<ApiOrderInfoSelectModel>>();

Merge方法:合并json

            JObject o1 = JObject.Parse(@"{
              'FirstName': 'John',
              'LastName': 'Smith',
              'Enabled': false,
              'Roles': [ 'User' ]
            }");
            JObject o2 = JObject.Parse(@"{
              'Enabled': true,
              'Roles': [  'Admin' ]
            }");
            o1.Merge(o2, new JsonMergeSettings
                // union arrays together to avoid duplicates
                MergeArrayHandling = MergeArrayHandling.Union
            });
            string json = o1.ToString();
            //   "FirstName": "John",
            //   "LastName": "Smith",
            //   "Enabled": true,
            //   "Roles": [
            //     "User",
            //     "Admin"
            //   ]
                    数据是,一般都是用反序列化来实现json数据的解读,这需要首先知道json数据的结构并且建立相应的类才能反序列化,一旦遇到动态的。数据,这种方法就不使用。为了解决动态解析json数据,微软有个。- 表示一个JSON数组(包含一个有序的List)- 表示一个JSON对象(包含一个。- 表示一个原生JSON值(- 表示一个JSON属性(在。直接实现对JSON的增删改查。封装类十分好用,里面的。
				
Newtonsoft.Json是一款.net下的Json序列化/反序列化库,省去了手动拼Json的麻烦,可以通过官网或者NuGet下载。 JObject是其中比较万金油的一个类,可以在不使用实体类的情况下构建/解析Json。 1.字符串转JObject 引入命名空间: using Newtonsoft.Json.Linq; Json数据: "name": "steam"...
Newtonsoft.Json的Unity转换器 该软件包包含往返于常见Unity类型的转换器。 类型,例如Vector2,Vector3,Matrix4x4,四元数,颜色,甚至ScriptableObject等等。 (请参阅的) Newtonsoft.Json软件包 此程序包需要在项目中包含Newtonsoft.Json.dll文件。 因此,它不必与我的jillejr.newtonsoft.json-for-unity软件包一起使用! 我认识到Unity生态系统中有太多的Newtonsoft.Json分支和变体。 该软件包可以与以下任何一项结合使用: 我自己的JamesNK原始牛顿软件的分支.Json回购: (推荐) SaladLab的叉子: ParentElement的资产商店软件包: ://www.parentelement.com/assets/json_
通过JObjectJArray创建JSON对象 我们先用非常简单的方法来动态创建一些JSON,可通过JToken派生的JSON.NET对象来进行,最常见的JToken派生的类是JObjectJArray。 正是因为JToken实现了IDynamicMetaProvider动态语言接口,所以可以使用dynamic关键字直观地创建动态对象,并把这个动态对象序列化为JSON字符串。 我们通过JAr...
"base":{ "hair":{"hair":{"name":"base/hair", "x":1424,"y":2564.5,"width":1132,"height":1177}}, "h_r":{"h...
原文出处:https://www.cnblogs.com/deepalley/p/10784344.html JObject用于操作JSON对象 JArray用语操作JSON数组 JValue表示数组中的值 JProperty表示对象中的属性,以"key/value"形式 JToken用于存放LinqtoJSON查询后的结果 /// &amp;amp;lt;summary&amp;amp;gt; /// Gets the j object. /// &amp;amp;lt;/summary&amp;amp;gt; /// &amp;amp;lt;returns&amp;amp;gt;&amp;amp;lt;/returns&amp;amp;gt; public JObject
public async Task<IActionResult> GetJson() string jsonText = "{\"input\" : \"value\",\"status\" :true,\"httpstatus\":200}"; JObject jo =
Newtonsoft.Json.Compact.rar 是一个压缩文件,它包含了 Newtonsoft.Json 的紧凑版本。Newtonsoft.Json 是一个流行的 JSON 序列化与反序列化库,Compact 版本则是在文件大小上进行了优化。 Newtonsoft.Json 已经成为了很多开发人员处理 JSON 数据的首选工具。它提供了非常灵活且易于使用的 API,可以轻松地将对象转换为 JSON 字符串并进行反向操作。通过使用它,我们可以在各种平台和编程语言中处理 JSON 数据,包括在 .NET 平台上开发的应用程序。 但在某些情况下,我们希望在存储或传输 JSON 数据时减少文件的体积,以减少存储空间和网络带宽的消耗。为了解决这个问题,Newtonsoft.Json 提供了 Compact 版本。Compact 版本通过删除一些不必要的空格和换行符,以及一些其他优化技巧,有效地压缩了输出的 JSON 文本。 当我们下载并提取 Newtonsoft.Json.Compact.rar 后,我们将得到一个压缩文件中的紧凑版本的 Newtonsoft.Json 库。我们可以使用这个库来在应用程序中序列化和反序列化 JSON 数据,但在序列化后的 JSON 数据中将不会包含额外的空格和换行符,从而减小了存储和传输的开销。 综上所述,Newtonsoft.Json.Compact.rar 是一个压缩文件,其中包含了 Newtonsoft.Json 库的紧凑版本。通过使用这个压缩库,我们可以更高效地处理 JSON 数据并减少存储和网络带宽的消耗。