想象一下,我有以下模型:
public class A{
public dynamic Data;
public Error Error;
}
我希望反序列化以下字符串:
"{
"data": {
"human": {
"name": "Luke Skywalker",
"height": 5.6430448
}
}
}"
如何像这样访问Data
?:
var name=varOfA.Data.human.name
//字符串
另外我想像这样投射Data
:
Person person=varOfA.Data.human as Person;
var name=person.name; //string
现在,属性数据始终是一个JObject,似乎这不起作用https://www.newtonsoft.com/json/help/html/QueryJsonDynamic.htm
编辑: 我可能没有很好地解释自己
我要求在A对象的JSON反序列化之后,动态类型的属性数据是一个Annonimous类型(https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/anonymous-types)。
因此,我可以访问类似*.Data.human.otherInternalProperty.aPrimitiveField
或Person person=*.Data.human as Person
或Person person=(Person) *.Data.human
答案 0 :(得分:0)
你能试试吗?
dynamic dynData = JsonConvert.DeserializeObject(a.Data); // a.Data is your json data
var data = dynData["data"];
var human = dynData["human"];
var name = dynData["name"].Value; // is name it what you're after?
编辑:制作样本rextester -
代码:
namespace Rextester
{
public class Program
{
public static void Main(string[] args)
{
string json = @"{
'data': {
'human': {
'name': 'Luke Skywalker',
'height': 5.6430448
}
}
}
";
A a = new A()
{
Data = json,
Error = null
};
dynamic dyn = JsonConvert.DeserializeObject(a.Data);
var data = dyn["data"];
var human = data["human"];
var name = human["name"].Value;
Console.WriteLine(name);
}
}
public class A
{
public dynamic Data;
public Error Error;
}
public class Error
{
}
}
答案 1 :(得分:0)
以下示例演示了如何实现问题中请求的内容。
public static void Main() {
string json = @"{
'data': {
'human': {
'name': 'Luke Skywalker',
'height': 5.6430448
}
}
}
";
dynamic varOfA = JsonConvert.DeserializeObject(json);
string name = varOfA.data.human.name;
Console.WriteLine(name); // Luke Skywalker
Person person = varOfA.data.human.ToObject<Person>();
name = person.name;
Console.WriteLine(name); //Luke Skywalker
}
public class Person {
public string name { get; set; }
public double height { get; set; }
}
虽然默认情况下反序列化的JSON将转换为JObject
,但使用dynamic
可以直接提取所需的值。
使用JObject.ToObject<T>()
根据需要将值转换为强类型对象。