具有动态字段的JSON对象

时间:2018-06-04 04:23:46

标签: c# json.net

想象一下,我有以下模型:

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.aPrimitiveFieldPerson person=*.Data.human as PersonPerson person=(Person) *.Data.human

的类型

2 个答案:

答案 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 -

  

http://rextester.com/IDPHR38984

代码:

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>()根据需要将值转换为强类型对象。