获取json对象并将其解析为C#对象

时间:2017-02-08 14:11:13

标签: c# .net json json.net

JSON:

[{
    "PersonsTable":[
    {"id":293,"firstname":"jos","lastname":"don"},
    {"id":1861,"firstname":"jef","lastname":"dan"},    
    {"id":1896,"firstname":"janine","lastname":"din"}]
}]

代码:

List<Person> persons = new List<Person>();
dynamic dynObj = JsonConvert.DeserializeObject(response);
foreach (var data in dynObj.PersonsTable)
{
     Person p = new Person(data.id, data.firstname, data.lastname);
     persons.Add(p);
}

对象:

 public class Person
{
    public Person ()
    {

    }
    public Person (string id, string firstname, string lastname)
    {
        this.id= id;
        this.firstname = firstname;
        this.lastname = lastname;
    }
    public string id{ get; set; }
    public string firstname{ get; set; }
    public string lastname{ get; set; }
}

我想把数据放在&#34; PersonsTable&#34;进入人名单。 我试图通过序列化和动态变量来实现这一点,但我总是得到一个奇怪的错误&#34;缺少编译器所需的成员,&#39; microsoft.CSharp.RUntimeBinder.CSharpArgumentINfo.Create&#39;&#34; .. < / p>

NuGet包本身我无法安装,因为我的项目在.Net 3.5中运行(出于某种原因)。

有人可以帮我解决问题吗?是否有其他方法可以获得结果中的人员名单?

3 个答案:

答案 0 :(得分:5)

我认为你的问题与json解析无关。

当您使用关键字“dynamic”时,您必须在项目中引用Microsoft.CSharp.dll。

请参见此处:C# dynamic compilation and "Microsoft.CSharp.dll" error

更新: 自从我发布了答案后,我发现你已经更新了你的问题。你现在说你在.Net 3.5中运行。 要清楚,动态在.Net 3.5中是不可用的。例如,请参阅Use of Dynamic Keyword in .Net 3.5

答案 1 :(得分:1)

你有一些问题:

  1. c#类的属性名称与JSON中的属性名称不匹配。 (注意 - 已在问题的编辑版本中修复。)

  2. 您的根JSON容器是一个包含单个对象的数组,而不是对象本身。解析时需要考虑额外的嵌套级别。

  3. 你说你正在运行。{3.5} does not support dynamic

  4. 您可以明确解析为dynamic,然后使用LINQ to JSON SelectTokens()手动映射到JToken类型,而不是使用Person

    var root = JToken.Parse(response);
    var persons = root
        // Use the JSONPath wildcard operator to select all entries in the "PersonsTable"
        .SelectTokens("[*].PersonsTable[*]")
        // And map the individual entry to a Person type.
        .Select(data => new Person((string)data["id"], (string)data["firstname"], (string)data["lastname"]))
        .ToList();
    

    即使你能够使用dynamic,这样做也会失去编译时错误检查。使用静态定义的方法可能会减少意外的运行时错误。

    示例fiddle

答案 2 :(得分:0)

使用字段List PersonsTable创建新的viewModel {get; set;},然后在端点上接受它,它将自动映射模型,你可能需要将[JsonProperty(PropertyName =“id”)]添加到你的Person类成员以进行正确的映射。