大佬教程收集整理的这篇文章主要介绍了分享基于.NET动态编译&Newtonsoft.Json封装实现JSON转换器(JsonConverter)原理及JSON操作技巧,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
private List<String> Parse(String csCodE) { var provider = new CSharpCodeProvider(); var cp = new CompilerParameters(); cp.GenerateExecutable = false; cp.GenerateInMemory = true; cp.IncludeDebugInformation = false; //cp.ReferencedAssemblies.Add("mscorlib.dll"); cp.ReferencedAssemblies.Add("System.dll"); cp.ReferencedAssemblies.Add("System.Data.dll"); cp.ReferencedAssemblies.Add("System.Linq.dll"); cp.ReferencedAssemblies.Add("System.ComponentModel.DataAnnotations.dll"); cp.ReferencedAssemblies.Add("Newtonsoft.Json.dll"); CompilerResults result = provider.CompileAssemblyFromsource(cp,csCodE); List<String> errList = new List<String>(); if (result.Errors.Count > 0) { foreach (CompilerError err in result.Errors) { errList.Add(String.Format("Line:{0},Errornumber:{1},ErrorText:{2}",err.Line,err.Errornumber,err.ErrorText)); } messageBox.Show("Compile error:\n" + String.Join("\n",errList)); return null; } dyAssembly = result.CompiledAssembly; return dyAssembly.GetTypes().SELEct(t => t.FullName).ToList(); } private String ToJsonString(String targetTypE) { if (dyAssembly == null) { messageBox.Show("dyAssembly is null!"); return null; } var type = dyAssembly.GetType(targetTypE); var typeConstructor = type.GetConstructor(Type.EmptyTypes); var obj = typeConstructor.Invoke(@R_262_6633@ return JsonConvert.serializeObject(obj,FormatTing.Indented,new JsonserializerSetTings { DateFormatString = "yyyy-MM-dd HH:mm:ss" }); }
private String ToClassCode(JObject jObject,String className) { var classCodes = new Dictionary<String,String>(); classCodes.Add(className,BuildClassCode(jObject,className,classCodes)); StringBuilder codeBuidler = new StringBuilder(); foreach (var code in classCodes) { codeBuidler.AppendLine(code.value); } return codeBuidler.ToString(); } private Dictionary<JTokenType,String> jTokenBaseTypeMappings = new Dictionary<JTokenType,String> { { JTokenType.Integer,"int" },{ JTokenType.Date,"datetiR_460_11845@e" },{ JTokenType.bytes,"byte[]"},{ JTokenType.Boolean,"bool"},{ JTokenType.String,"String"},{ JTokenType.Null,"object"},{ JTokenType.Float,"float"},{ JTokenType.TimeSpan,"long"} }; private String BuildClassCode(JObject jObject,String className,Dictionary<String,String> classCodes) { StringBuilder classBuidler = new StringBuilder(); classBuidler.Append("public class " + className + " \r\n { \r\n"); foreach (var jProp in jObject.Properties()) { String propClassName = "object"; if (jProp.Value.Type == JTokenType.object) { if (jProp.Value.HasValues) { propClassName = GetClassName(jProp.Name); if (classCodes.ContainsKey(propClassName)) { propClassName = className + propClassName; } classCodes.Add(propClassName,BuildClassCode((JObject)jProp.Value,propClassName,classCodes)); } classBuidler.AppendFormat("public {0} {1} {2}\r\n",jProp.Name,"{get;set;}"); } else if (jProp.Value.Type == JTokenType.Array) { if (jProp.Value.HasValues) { var jPropArrItem = jProp.Value.First; if (jPropArrItem.Type == JTokenType.object) { propClassName = GetClassName(jProp.Name); if (classCodes.ContainsKey(propClassName)) { propClassName = className + propClassName; } propClassName += "Item"; classCodes.Add(propClassName,BuildClassCode((JObject)jPropArrItem,classCodes)); } else { if (jTokenBaseTypeMappings.ContainsKey(jPropArrItem.TypE)) { propClassName = jTokenBaseTypeMappings[jPropArrItem.Type]; } else { propClassName = jPropArrItem.Type.ToString(); } } } classBuidler.AppendFormat("public List<{0}> {1} {2}\r\n","{get;set;}"); } else { if (jTokenBaseTypeMappings.ContainsKey(jProp.Value.TypE)) { propClassName = jTokenBaseTypeMappings[jProp.Value.Type]; } else { propClassName = jProp.Value.Type.ToString(); } classBuidler.AppendFormat("public {0} {1} {2} \r\n","{get;set;}"); } } classBuidler.Append("\r\n } \r\n"); return classBuidler.ToString(); }
using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; namespace Zuowj.EasyUtils { /// <sumMary> /// JObject扩展类 /// author:zuowenjun /// 2019-6-15 /// </sumMary> public static class JObjectExtensions { /// <sumMary> /// 根据Jpath查找JSON指定的属性节点值 /// </sumMary> /// <param name="jObj"></param> /// <param name="fieldPath"></param> /// <returns></returns> public static IEnumerable<JToken> FindJsonNodeValues(this JObject jObj,String fieldPath) { var tks = jObj.SELEctTokens(fieldPath,truE); List<JToken> nodeValues = new List<JToken>(); foreach (var tk in tks) { if (tk is JProperty) { var jProp = tk as JProperty; nodeValues.Add(jProp.value); } else { nodeValues.Add(tk); } } return nodeValues; } /// <sumMary> /// 根据Jpath查找JSON指定的属性节点并赋值 /// </sumMary> /// <param name="jObj"></param> /// <param name="fieldPath"></param> /// <param name="value"></param> public static void SetJsonNodeValue(this JObject jObj,String fieldPath,JToken value) { var tks = jObj.SELEctTokens(fieldPath,truE); JArray targetJArray = null; List<int> arrIndexs = new List<int>(); foreach (var tk in tks) { JProperty jProp = null; if (tk is JProperty) { jProp = tk as JProperty; } else if (tk.Parent is JProperty) { jProp = (tk.Parent as JProperty); } else if (tk.Parent is JObject) { jProp = (tk.Parent as JObject).Property(tk.Path.SubString(tk.Path.LasTindexOf(‘.‘) + 1)); } if (jProp != null) { jProp.Value = value; } else if (tk.Parent is JArray) //注意不能直接在for循环中对JArray元素赋值,否则会@R_944_10502@ { targetJArray = tk.Parent as JArray; arrIndexs.Add(targetJArray.IndexOf(tk)); } else { throw new Exception("无法识别的元素"); } } //单独对找到的数组元素进行重新赋值 if (targetJArray != null && arrIndexs.Count > 0) { foreach (int i in arrIndexs) { targetJArraY[i] = value; } } } /// <sumMary> /// 在指定的JPath的属性节点位置前或后创建新的属性节点 /// </sumMary> /// <param name="jObj"></param> /// <param name="fieldPath"></param> /// <param name="name"></param> /// <param name="value"></param> /// <param name="addBefore"></param> /// <returns></returns> public static void AppendJsonNode(this JObject jObj,String name,JToken value,bool addBefore = falsE) { var nodeValues = FindJsonNodeValues(jObj,fieldPath); if (nodeValues == null || !nodeValues.Any()) return; foreach (var node in nodeValues) { var targetNode = node; if (node is JObject) //注意只能对普能单值 的JToken对象(JProptery)允许添加,若不是则应找对应的属性信息 { targetNode = node.Parent; } var jProp = new JProperty(name,value); if (addBeforE) { targetNode.AddBeforeSelf(jProp); } else { targetNode.AddAfterSelf(jProp); } } } } }
var jsonObj = new { Root = new { Lv1 = new { col1 = 123,col2 = true,col3 = new { f1 = "aa",f2 = "bb",f3 = "cc",Lv2 = new { flv1 = 1,flv2 = "flv2-2" } } } },Main = new[] { new{ mf1="x",mf2="y",mf3=123 },new{ mf1="x2",mf2="y2",mf3=225 } } }; String json = JsonConvert.serializeObject(jsonObj,FormatTing.Indented); Console.WriteLine("JSON1:" + json); var jObj = JObject.FromObject(jsonObj); //JObject.Parse(json); var findResult = jObj.FindJsonNodeValues("Root.Lv1.col3.Lv2.*"); Console.WriteLine("FindJsonNodeValues:" + String.Join(",",findResult)); jObj.SetJsonNodeValue("Main[*].mf2","*changed value*"); json = JsonConvert.serializeObject(jObj,FormatTing.Indented); Console.WriteLine("JSON2:" + json); jObj.AppendJsonNode("Root.Lv1.col3.Lv2","LV2-New",JObject.FromObject(new {flv21="a2",flv22=221,flv23=true })); // jObj.AppendJsonNode("Root.Lv1.col3.Lv2","LV2-2","single value"); json = JsonConvert.serializeObject(jObj,FormatTing.Indented); Console.WriteLine("JSON3:" + json); Console.ReadKey();
JSON1:{ "Root": { "Lv1": { "col1": 123,"col2": true,"col3": { "f1": "aa","f2": "bb","f3": "cc","Lv2": { "flv1": 1,"flv2": "flv2-2" } } } },"Main": [ { "mf1": "x","mf2": "y","mf3": 123 },{ "mf1": "x2","mf2": "y2","mf3": 225 } ] } FindJsonNodeValues:1,flv2-2@H_673_16@ JSON2:{ "Root": { "Lv1": { "col1": 123,"mf2": "*changed value*","mf3": 225 } ] }@H_673_16@ JSON3:{ "Root": { "Lv1": { "col1": 123,"flv2": "flv2-2" },"LV2-New": { "flv21": "a2","flv22": 221,"flv23": true } } } },"mf3": 225 } ] }
以上是大佬教程为你收集整理的分享基于.NET动态编译&Newtonsoft.Json封装实现JSON转换器(JsonConverter)原理及JSON操作技巧全部内容,希望文章能够帮你解决分享基于.NET动态编译&Newtonsoft.Json封装实现JSON转换器(JsonConverter)原理及JSON操作技巧所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。