C# 带有动态字段的JSON对象

C# 带有动态字段的JSON对象,c#,json.net,C#,Json.net,假设我有以下模型: public class A{ public dynamic Data; public Error Error; } 我想反序列化以下字符串: "{ "data": { "human": { "name": "Luke Skywalker", "height": 5.6430448 } } }" 我如何才能像这样访问数据: var name=varOfA.Data.human.name//字符串 此外,我还想

假设我有以下模型:

public class A{
    public dynamic Data;
    public Error Error;
}
我想反序列化以下字符串:

"{
  "data": {
    "human": {
      "name": "Luke Skywalker",
      "height": 5.6430448
    }
  }
}"
我如何才能像这样访问
数据
var name=varOfA.Data.human.name
//字符串

此外,我还想将
数据
如下:

Person-Person=varOfA.Data.human-as-Person;
var name=person.name//一串

现在,属性数据总是一个JObject,似乎这不起作用

编辑: 我可能没有很好地解释我自己

我要求在对对象的JSON进行反序列化之后,dynamic类型的属性数据内部是一个Annonimous类型()
因此,我可以访问像
*.Data.human.otherInternalProperty.aPrimitiveField
Person-Person=*.Data.human-as-Person
Person-Person=(Person)*.Data.human

这样的类型,您能试试吗

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?
编辑:制作样品测试仪-

代码:


下面的示例演示如何实现问题中要求的内容

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; }
}
publicstaticvoidmain(){
字符串json=@”{
“数据”:{
“人类”:{
“姓名”:“卢克·天行者”,
“高度”:5.6430448
}
}
}
";
动态varOfA=JsonConvert.DeserializeObject(json);
字符串名称=varOfA.data.human.name;
Console.WriteLine(名称);//卢克·天行者
Person=varOfA.data.human.ToObject();
name=person.name;
Console.WriteLine(名称);//卢克·天行者
}
公共阶层人士{
公共字符串名称{get;set;}
公共双倍高度{get;set;}
}
默认情况下,反序列化的JSON将转换为
JObject
,而使用
dynamic
可以直接提取所需的值


使用
JObject.ToObject()
根据需要将值转换为强类型对象。

可以尝试
var name=(varOfA.Data为动态)。human.name
?我现在还不能证实这一点,但我相信有一种方法是这样的。@vasily.sib我已经更新了问题我已经更新了问题。但是你的answare现在似乎更好了我已经更新了这个问题。您的示例就是我现在正在使用的,但我希望避免将动态作为JObject公开。其思想是在其他序列化格式中使用相同的模型,等等。。。
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; }
}