JObject转匿名类型实现方案咨询:可变JSON格式转换需求
嘿,这个需求我刚好折腾过,给你分两部分来解决——先搞定字符串格式化的问题,再聊聊动态创建对象的可行方案:
一、将JObject格式化为目标字符串格式
因为你的JSON结构不固定,所以得动态遍历所有属性来拼接成想要的格式。这里用Newtonsoft.Json的JObject来实现,核心思路是遍历每个属性,根据值的类型决定是否加引号,最后拼接成目标字符串:
using Newtonsoft.Json.Linq; public string FormatJObjectToCustomString(JObject jObject) { var propertyStrings = new List<string>(); foreach (var prop in jObject.Properties()) { // 判断值类型,字符串需要包裹双引号 string valueRepresentation = prop.Value.Type switch { JTokenType.String => $"\"{prop.Value.ToString()}\"", _ => prop.Value.ToString() }; propertyStrings.Add($"{prop.Name} = {valueRepresentation}"); } return $"{{ {string.Join(", ", propertyStrings)} }}"; }
调用的时候直接传你的JObject就行,比如:
var jsonStr = "{\"Prop1\":\"Prop1Value\",\"Prop2\":1,\"Prop3\":\"Prop3Value\",\"dtProp\":\"2019-12-30T09:59:48\"}"; var jObject = JObject.Parse(jsonStr); var result = FormatJObjectToCustomString(jObject); // result就是你要的:{ Prop1 = "Prop1Value", Prop2 = 1, Prop3 = "Prop3Value", dtProp = "2019-12-30T09:59:48" }
二、动态创建对象的方案
既然JSON结构不固定,强类型肯定不行,这里有两个常用的动态对象方案:
1. 使用ExpandoObject(推荐,支持对象式属性访问)
ExpandoObject允许你动态添加属性,之后可以像访问普通对象属性一样操作它,非常灵活:
using System.Dynamic; using Newtonsoft.Json.Linq; public dynamic ConvertJObjectToDynamic(JObject jObject) { dynamic expandoObj = new ExpandoObject(); var expandoDict = (IDictionary<string, object>)expandoObj; foreach (var prop in jObject.Properties()) { // 自动转换值的类型 expandoDict[prop.Name] = prop.Value.ToObject<object>(); } return expandoObj; }
使用示例:
var dynamicObj = ConvertJObjectToDynamic(jObject); // 可以直接用属性名访问:dynamicObj.Prop1,dynamicObj.Prop2等等 Console.WriteLine(dynamicObj.dtProp); // 输出2019-12-30T09:59:48
2. 使用Dictionary<string, object>(轻量,适合简单场景)
如果不需要对象式的属性访问,用字典更轻量,转换也更简单:
using Newtonsoft.Json.Linq; public Dictionary<string, object> ConvertJObjectToDictionary(JObject jObject) { // 直接用Newtonsoft的内置转换方法 return jObject.ToObject<Dictionary<string, object>>(); }
使用示例:
var dict = ConvertJObjectToDictionary(jObject); Console.WriteLine(dict["Prop3"]); // 输出Prop3Value
这两种方案都能完美应对结构不固定的JSON场景,你可以根据后续的使用需求来选择~
内容的提问来源于stack exchange,提问作者Ayyappa P
相关产品推荐
相关产品推荐

