时间:2019-01-19标签:c#jsonimplicitnewtonsoftdeserializeObject

时间:2018-07-30 10:45:42

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

有了Newtonsoft,我知道我可以声明类型化的类并将json反序列化为具体的类...是否有一种方法可以隐式反序列化json,并允许newtonsoft程序集进行推断json类型的工作?

2 个答案:

答案 0 :(得分:0)

您始终可以反序列化任何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);

答案 1 :(得分:-1)

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; }
}