关于json反序列化

enaking 2018-01-03 09:53:52
json反序列化,在网上搜到的json反序列化都是已经知道json的固定对象,然后序列化为已经申明好的对象,但我想要的是json结构是未知的,是不是多层结构或列表也是未知的。根据自身的结构自动生成树型或列表 如图,求思路,谢谢。

...全文
332 点赞 收藏 12
写回复
12 条回复
Anonymous477 2018年01月03日
遍历json?简单写了一下。。。

static void Main(string[] args)
{
JObject jObject = JObject.Parse("{\"name\":\"test\",\"array\":[1,2,3]}");

Console.WriteLine($"直接访问name节点:{jObject["name"]}");

Console.WriteLine("遍历:");
AnalysisNode(jObject);

Console.ReadLine();
}

private static void AnalysisNode(object node)
{
if (node is JObject jObject)
{
if (jObject.HasValues)
{
foreach (var item in jObject)
{
Console.WriteLine($"节点:{item.Key}");
AnalysisNode(item.Value);
}
}
}
else if (node is JArray jArray)
{
if (jArray.HasValues)
{
foreach (var item in jArray)
{
AnalysisNode(item);
}
}
}
else if (node is JToken jToken)
{
Console.WriteLine(jToken);
}
}

需要Newtonsoft.Json

效果
回复 点赞
enaking 2018年01月03日
引用 4 楼 hanjun0612 的回复:
使用 dynamic 来反序列化。
谢谢兄弟,我就是已经转化成dynamic ,但其dynamic 的数据结构是未知的,如何自动根据结构生成树型结构或列表。 dynamic dn = JsonHelper.DeSerializationJson(strRt); 我就是想在项目里集成一个json工具,就像https://www.bejson.com/jsonviewernew/
回复 点赞
enaking 2018年01月03日
引用 4 楼 hanjun0612 的回复:
使用 dynamic 来反序列化。
谢谢兄弟,我就是已经转化成dynamic ,但其dynamic 的数据结构是未知的,如何自动根据结构生成树型结构或列表。 dynamic dn = JsonHelper.DeSerializationJson(strRt);
回复 点赞
娃都会打酱油了 2018年01月03日
你这个不就是常见的Response封装体么,你肯定有业务场景能判断T具体是什么的
class Response<T>
{
pubic T Body{get;set;}
}
回复 点赞
正怒月神 2018年01月03日
使用 dynamic 来反序列化。
回复 点赞
正怒月神 2018年01月03日
static void Main(string[] args)
        {
            string json = "{\"a\":12,\"b\":[{\"c\":\"hello\"},{\"c\":\"tttt\"}]}";
            dynamic obj = JsonConvert.DeserializeObject<dynamic>(json);
            Console.WriteLine(obj.a);
            Console.WriteLine(obj.b[0].c);

            Console.ReadLine();
        }
回复 点赞
圣殿骑士18 2018年01月03日
反序列化为dynamic类型,随便你怎么访问。
回复 点赞
enaking 2018年01月03日
引用 1 楼 zhuo_wp 的回复:
你反序列化的时候肯定是要知道反序列化的对象类型的。 不过你的要求可以用泛型来实现。 贴一下我在另一个帖子里放的代码:
public static class JsonConvertHelper
    {
        public static string Obj2Json<T>(T obj, Encoding encoding = null)
        {
            DataContractJsonSerializer serializer = null;
            if (obj != null)
            {
                serializer = new DataContractJsonSerializer(obj.GetType());
            }
            else
            {
                serializer = new DataContractJsonSerializer(typeof(T));
            }
             
            string json = string.Empty;
            using (MemoryStream ms = new MemoryStream())
            {
                serializer.WriteObject(ms, obj);
                if (encoding == null)
                {
                    json = Encoding.UTF8.GetString(ms.GetBuffer());
                }else
                {
                    json = encoding.GetString(ms.GetBuffer());
                }
                ms.Close();
            }
 
            json = json.Trim('\0');
 
            return json;
        }
 
        public static T Json2Obj<T>(this string json)
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
            T obj = default(T);
            using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
            {
                obj = (T)serializer.ReadObject(ms);
                ms.Close();
            }
 
            return obj;
        }
 
 
    }
代码要引用系统自带的程序集System.Runtime.Serialization
我的意思就是写一个json工具或JsonHelper,你的方案在代码完成前最终还是需要知道对结构对象,我要的是这样的效果,能满足任何结构的josn反序列化,https://www.bejson.com/jsonviewernew/ 就是我截的图的效果。
回复 点赞
zhuowp 2018年01月03日
你反序列化的时候肯定是要知道反序列化的对象类型的。 不过你的要求可以用泛型来实现。 贴一下我在另一个帖子里放的代码:
public static class JsonConvertHelper
    {
        public static string Obj2Json<T>(T obj, Encoding encoding = null)
        {
            DataContractJsonSerializer serializer = null;
            if (obj != null)
            {
                serializer = new DataContractJsonSerializer(obj.GetType());
            }
            else
            {
                serializer = new DataContractJsonSerializer(typeof(T));
            }
             
            string json = string.Empty;
            using (MemoryStream ms = new MemoryStream())
            {
                serializer.WriteObject(ms, obj);
                if (encoding == null)
                {
                    json = Encoding.UTF8.GetString(ms.GetBuffer());
                }else
                {
                    json = encoding.GetString(ms.GetBuffer());
                }
                ms.Close();
            }
 
            json = json.Trim('\0');
 
            return json;
        }
 
        public static T Json2Obj<T>(this string json)
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
            T obj = default(T);
            using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
            {
                obj = (T)serializer.ReadObject(ms);
                ms.Close();
            }
 
            return obj;
        }
 
 
    }
代码要引用系统自带的程序集System.Runtime.Serialization
回复 点赞
以专业开发人员为伍 2018年01月03日
dynamic 是一个针对反射功能的语法糖机制,并不是具体的数据结构。所以滥用 dynamic 实际上你就不知道真正的强类型。编程设计就是要懂得强类型设计,懂得具体类型,而不是只知道套用 dynamic 语法。
引用 8 楼 enaking 的回复:
[quote=引用 4 楼 hanjun0612 的回复:] 使用 dynamic 来反序列化。
谢谢兄弟,我就是已经转化成dynamic ,但其dynamic 的数据结构是未知的,如何自动根据结构生成树型结构或列表。 dynamic dn = JsonHelper.DeSerializationJson(strRt); 我就是想在项目里集成一个json工具,就像https://www.bejson.com/jsonviewernew/[/quote]
回复 点赞
以专业开发人员为伍 2018年01月03日
继续借用 #3 楼的代码,我们来看看怎么读取”数字为属性名称“的对象,
string json = "{\"a\":12,\"b\":[{\"c\":\"hello\"},{\"c\":\"tttt\"}], 0:{code:\"abcde\"}}";
dynamic obj = JsonConvert.DeserializeObject<ExpandoObject>(json);
Console.WriteLine(obj.a);
Console.WriteLine(obj.b[0].c);
var dic = (IDictionary<string, dynamic>)obj;
Console.WriteLine(dic["0"].code);
这里因为知道了 ExpandoObject 的接口特性,所以才读取了最终的 code。要操作好数据,既需要抽象又同时需要具体化。
回复 点赞
以专业开发人员为伍 2018年01月03日
引用 7 楼 enaking 的回复:
[quote=引用 4 楼 hanjun0612 的回复:] 使用 dynamic 来反序列化。
谢谢兄弟,我就是已经转化成dynamic ,但其dynamic 的数据结构是未知的,如何自动根据结构生成树型结构或列表。 dynamic dn = JsonHelper.DeSerializationJson(strRt);[/quote] 你可以调试一下 #3 楼的代码,obj.GetType().FullName 看看结果。其实 obj 就是 JObject 对象。只有知道了具体的东西,才知道 obj.a、obj.b[0].c会有什么结果。 例如,实际上那个代码应该写为
dynamic obj = JsonConvert.DeserializeObject<ExpandoObject>(json);
Console.WriteLine(obj.a);
Console.WriteLine(obj.b[0].c);
才更符合绝大多数人的第一感觉和想法。这能说明一个道理:不要盲目抽象。
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.4w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告