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



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

我想将"人员表"下的数据放入人员列表中。我试图使用序列化和动态变量来实现这一点,但我总是收到一个奇怪的错误"缺少编译器所需的成员,'微软。CSharp.RUntimeBinder.CSharpArgumentINfo.Create'"..

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

有人可以帮助我解决问题吗?还有其他方法可以获取结果中的人员列表吗?

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

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

例如,请参阅此处:C# 动态编译和"Microsoft.CSharp.dll"错误

更新:自从我发布答案以来,我看到您已经更新了您的问题。您现在说您正在运行 .Net 3.5。需要明确的是,动态在.Net 3.5中不可用。例如,请参阅在 .Net 3.5 中使用动态关键字。

您有几个问题:

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

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

  3. 说您运行的是不支持dynamic的 .Net 3.5

JToken您可以使用 LINQ to JSON 手动映射到Person类型,而不是使用 dynamic ,而不是使用

,然后使用 LINQ to JSON 手动映射到您的SelectTokens()

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,这样做也会丢失编译时错误检查。 使用静态定义的方法可能会减少意外的运行时错误。

样品小提琴。

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

相关内容

  • 没有找到相关文章

最新更新