有了Newtonsoft,我知道我可以声明类型化的类并将json反序列化为具体的类...是否有一种方法可以隐式反序列化json,并允许newtonsoft程序集进行推断json类型的工作?
答案 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; }
}