是否有可能从json反序列化使用json.net返回一个动态对象?我想这样做:

dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);

当前回答

从Json开始。NET 4.0版本1,有原生动态支持:

[Test]
public void DynamicDeserialization()
{
    dynamic jsonResponse = JsonConvert.DeserializeObject("{\"message\":\"Hi\"}");
    jsonResponse.Works = true;
    Console.WriteLine(jsonResponse.message); // Hi
    Console.WriteLine(jsonResponse.Works); // True
    Console.WriteLine(JsonConvert.SerializeObject(jsonResponse)); // {"message":"Hi","Works":true}
    Assert.That(jsonResponse, Is.InstanceOf<dynamic>());
    Assert.That(jsonResponse, Is.TypeOf<JObject>());
}

当然,获得当前版本的最佳方式是通过NuGet。

更新(11/12/2014)以解决意见:

这工作得非常好。如果您在调试器中检查该类型,您将看到该值实际上是动态的。底层类型是一个JObject。如果你想控制类型(比如指定ExpandoObject),那么就这样做。

其他回答

如果你反序列化为动态,你会得到一个JObject。你可以通过使用ExpandoObject得到你想要的东西。

var converter = new ExpandoObjectConverter();    
dynamic message = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);

是的,你可以使用JsonConvert.DeserializeObject。要做到这一点,只需简单地做:

dynamic jsonResponse = JsonConvert.DeserializeObject(json);
Console.WriteLine(jsonResponse["message"]);

从Json开始。NET 4.0版本1,有原生动态支持:

[Test]
public void DynamicDeserialization()
{
    dynamic jsonResponse = JsonConvert.DeserializeObject("{\"message\":\"Hi\"}");
    jsonResponse.Works = true;
    Console.WriteLine(jsonResponse.message); // Hi
    Console.WriteLine(jsonResponse.Works); // True
    Console.WriteLine(JsonConvert.SerializeObject(jsonResponse)); // {"message":"Hi","Works":true}
    Assert.That(jsonResponse, Is.InstanceOf<dynamic>());
    Assert.That(jsonResponse, Is.TypeOf<JObject>());
}

当然,获得当前版本的最佳方式是通过NuGet。

更新(11/12/2014)以解决意见:

这工作得非常好。如果您在调试器中检查该类型,您将看到该值实际上是动态的。底层类型是一个JObject。如果你想控制类型(比如指定ExpandoObject),那么就这样做。

Json。NET允许我们这样做:

dynamic d = JObject.Parse("{number:1000, str:'string', array: [1,2,3,4,5,6]}");

Console.WriteLine(d.number);
Console.WriteLine(d.str);
Console.WriteLine(d.array.Count);

输出:

 1000
 string
 6

这里的文档:LINQ to JSON with JSON。网

参见JObject。解析和JArray。解析

我知道这是旧的帖子,但JsonConvert实际上有一个不同的方法,所以它会

var product = new { Name = "", Price = 0 };
var jsonResponse = JsonConvert.DeserializeAnonymousType(json, product);