【问题标题】:get json object and parse it into a C# object获取 json 对象并将其解析为 C# 对象
【发布时间】:2017-06-26 04:55:58
【问题描述】:

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

我想将“PersonsTable”下的数据放入人员列表中。 我试图通过序列化和动态变量来实现这一点,但我总是得到一个奇怪的错误“缺少编译器所需的成员,'microsoft.CSharp.RUNtimeBinder.CSharpArgumentINfo.Create'”..

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

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

【问题讨论】:

  • 可能是因为在 json 中没有 PK_R_PERSON, FIRSTNAME, LASTNAME ,但只有 id, firstname, lastname
  • 完全是我的错,我改了名字,所以人们在这里看会更好,在代码中都是一样的(大写)
  • @dbc 只是我不擅长复制粘贴

标签: c# .net json json.net


【解决方案1】:

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

当您使用关键字“动态”时,您的项目中必须有对 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你有几个问题:

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

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

      3. 你说你在 .Net 3.5 上运行 does not support dynamic

      您可以显式解析为JToken,而不是使用dynamic,然后使用LINQ to JSONSelectTokens() 手动映射到您的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

      【讨论】:

      • 注意 - 使用问题的原始版本编写的答案,您现在已对其进行编辑以更改您的 Person 类型。
      • 这行得通,非常感谢,我有一个问题。在这里,我想得到一个 List 作为结果,如果我只想要 Person 作为结果(假设我在 JSON 中有 1 个条目),我对其进行了测试并且只是摆脱了 (.ToList();)和或在 root 之前添加 (Person) 没有这样做。
      • 嗯,这是一个列表,所以你可以做person = persons[0]。或者使用SingleOrDefault() 而不是ToList()
      • 我做了我觉得丑陋的 list.first(),.singleOrDefault() 工作,谢谢!
      猜你喜欢
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多