使用Json.net反序列化后,是否可以返回一个动态对象?我想做这样的事情:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
使用Json.net反序列化后,是否可以返回一个动态对象?我想做这样的事情:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
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
查看文档: 使用Json.NET进行LINQ to JSON
JArray.Parse
。 - jgillichDim d As Object = JObject.Parse("{number:1000, str:'string', array: [1,2,3,4,5,6]}")
。 - ilans从Json.NET 4.0 Release 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
),那就这样做。
@Model.Prop
名称。 - GutekJValue
。这让我感到困惑,因为我在调试器/立即窗口中工作时并没有看到只有 string
。David 在底部的截图中展示了这一点。JValue
是可转换的,所以你可以直接使用 string m = jsonResponse.message
。 - Luke Puplett如果你只是将其反序列化为 dynamic,你会得到一个 JObject。通过使用 ExpandoObject,你可以得到你想要的内容。
var converter = new ExpandoObjectConverter();
dynamic message = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);
我知道这是旧帖子了,但 JsonConvert 实际上有一个不同的方法,因此它应该是
var product = new { Name = "", Price = 0 };
var jsonResponse = JsonConvert.DeserializeAnonymousType(json, product);
你可以使用JsonConvert.DeserializeObject来实现。只需简单执行以下操作:
dynamic jsonResponse = JsonConvert.DeserializeObject(json);
Console.WriteLine(jsonResponse["message"]);
JsonConvert
不包含名为 Deserialize
的方法。 - Can Poyrazoğlu注意:我在2010年回答这个问题时,没有办法在没有类型的情况下进行反序列化,这种方法允许您在不定义实际类的情况下进行反序列化,并允许使用匿名类来执行反序列化。
你需要一些类型来进行反序列化。您可以按照以下方式进行操作:
var product = new { Name = "", Price = 0 };
dynamic jsonResponse = JsonConvert.Deserialize(json, product.GetType());
我的答案基于.NET 4.0内置的JSON序列化器的解决方案。在此处链接到反序列化为匿名类型:
dynamic d = JObject.Parse...
没有区别。 - Philldynamic Obj = JsonConvert.DeserializeObject(<your json string>);
对于非母语类型来说,这有点棘手。假设在您的Obj中,有一个ClassA和ClassB对象。它们都被转换为JObject。您需要做的是:
ClassA ObjA = Obj.ObjA.ToObject<ClassA>();
ClassB ObjB = Obj.ObjB.ToObject<ClassB>();
PM> Install-Package JDynamic
支持使用字符串索引访问成员,例如:
dynamic json = new JDynamic("{a:{a:1}}");
Assert.AreEqual(1, json["a"]["a"]);
测试用例
您可以按照以下方式使用此实用程序:
直接获取值
dynamic json = new JDynamic("1");
//json.Value
2.获取json对象中的成员
dynamic json = new JDynamic("{a:'abc'}");
//json.a is a string "abc"
dynamic json = new JDynamic("{a:3.1416}");
//json.a is 3.1416m
dynamic json = new JDynamic("{a:1}");
//json.a is integer: 1
3.IEnumerable
dynamic json = new JDynamic("[1,2,3]");
/json.Length/json.Count is 3
//And you can use json[0]/ json[2] to get the elements
dynamic json = new JDynamic("{a:[1,2,3]}");
//json.a.Length /json.a.Count is 3.
//And you can use json.a[0]/ json.a[2] to get the elements
dynamic json = new JDynamic("[{b:1},{c:1}]");
//json.Length/json.Count is 2.
//And you can use the json[0].b/json[1].c to get the num.
其他
dynamic json = new JDynamic("{a:{a:1} }");
//json.a.a is 1.