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; }
}