【问题标题】:c# Json Implicit Newtonsoft DeserializeObjectc# Json 隐式 Newtonsoft DeserializeObject
【发布时间】:2018-07-30 10:45:41
【问题描述】:

使用 Newtonsoft,我知道我可以声明类型化类并将 json 反序列化为具体类...有没有办法隐式反序列化 json 并允许 newtonsoft 程序集完成推断 json 类型的工作?

【问题讨论】:

  • Newtonsoft 有一个完整的类型库,用于处理没有具体类的原始 json、JObject JArray JToken 等......你的意思是这样吗?
  • 如果你得到这个工作,考虑到你不知道类型,你希望如何使用返回的对象?
  • “推断json类型”来定义你的意思。你的意思是你想给它一系列类型,它会猜测哪种类型最匹配传递的 JSON?
  • 您是否正在寻找可以为您生成 C# 类型的东西? app.quicktype.io?share=O7OBJHPU9mRlz6yvLmD4

标签: c# .net json serialization json.net


【解决方案1】:

您始终可以反序列化任何 JSON。但是要使用它,您需要知道它的结构。

例如,下面的代码将反序列化并将任何 JSON 显示到控制台中

void UnpackJson(JToken jobj, int indent)
{
    if (jobj == null)
        return;

    var name = (jobj as JProperty)?.Name;
    if (name != null)
    {
        Console.Write(new string(' ', indent) + name + " :\n");
        indent += 4;
    }

    foreach (var child in jobj.Children())
    {
        var chname = (child as JProperty)?.Name;
        if (chname != null)
            Console.Write(new string(' ', indent) + chname + " : ");

        var value = (child as JProperty)?.Value;
        if (child.Values().Count() > 1)
        {
            if (chname != null || name != null)
                Console.WriteLine();

            IEnumerable<JToken> jt = (value is JArray) ? child.Values() : child.Children();

            foreach (var val in jt)
                UnpackJson(val, indent + 4);
        }
        else
        {
            if (value != null)
                Console.WriteLine(value);
        }
    }
}

可以这样调用:

JObject obj = JObject.Parse(json);  
UnpackJson(obj, 0);

【讨论】:

    【解决方案2】:

    JSON.NET 可以在对象层次结构中进行大量类型推断,但它至少需要知道顶级对象类型。否则反序列化的对象将是动态的。下面是一个静态类型反序列化的例子:

    void Main()
    {
        var foo = new Foo()
        {
            Id = 1,
            Bar = new Bar { Message = "Message" }
        };
    
        var json = JsonConvert.SerializeObject(foo);
        var foo2 = JsonConvert.DeserializeObject<Foo>(json);
    
        //foo == foo2 here
    }
    
    public class Foo
    {
        public int Id { get; set; }
        public Bar Bar { get; set; }
    }
    
    public class Bar 
    {
        public string Message { get; set; }
    }
    

    【讨论】:

    • 类型推断在哪里?
    • 如果Bar 是抽象的(或接口)并且有多种可能的具体实现怎么办?这里没有类型推断。
    猜你喜欢
    • 2014-03-21
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    相关资源
    最近更新 更多