【问题标题】:Json.NET parse array in objectJson.NET 解析对象中的数组
【发布时间】:2014-03-10 00:20:31
【问题描述】:

我很难从一个数组中解析出多个数组,这些数组嵌入在 JSON 中的多个对象中。

基本上json看起来像

{
 took:8,
 success:true,
 items:[
  keywords:{...},
  mainInfo:{
    name:'...',
    expDate:'...',
    targetCities:[...],
    targetStates:[...]
  },
  additionalInfo:{
    skills:[],
    homeTime:''
  }
}

我的 C# 看起来像:

public class Job{
  public string name{get;set;}
  public List<string> targetCities{get;set;}
  public List<string> targetStates{get;set;}
  public List<string> skills{get;set;}
  public string homeTime{get;set;}
}
public class Jobs{
  private JObject o;
  private List<Job> jobs;
  public Jobs(string json){
    this.o=JObject.Parse(json);
  }
  public List<Job> toList(){
    List<JObject> allJobs=o["items"].Select(t => (JObject)t).ToList();
    foreach(JObject i in allJobs){
      Job j=new Job();
      j.name=(string)i["mainInfo"]["name"];
      j.targetCities=i["mainInfo"]["targetCities"].Select(t =>(string)t).ToList();
      j.targetStates=i["mainInfo"]["targetStates"].Select(t =>(string)t).ToList();
      j.expDate=(string)i["mainInfo"]["expDate"]
      j.skills=i["additionalInfo"]["skills"].Select(t =>(string)t).ToList();
      j.homeTime=(string)i["additionalInfo"]["homeTime"];
      this.jobs.Add(j); //ERROR
    }
    return this.jobs;
}

错误是Null Reference Exception,信息为Object reference not set to an instance of an object.,但是当我尝试更改代码以修复错误时,似乎此错误几乎不可预测地跳来跳去。

我绝不是 C# 或 .NET 专家。我过去处理过这种语言,但我个人不喜欢它。所以请原谅我可能犯的任何愚蠢的错误。

补充:

我基本上是逐步浏览所有项目并尝试使用相应的数据从每个项目创建一个Job 对象。

【问题讨论】:

  • JObject是如何定义的?
  • 这是一个 JSON.net 对象

标签: c# json linq json.net


【解决方案1】:

您忘记初始化 jobs 字段 private List&lt;Job&gt; jobs; 如果您始终生成作业列表,则不需要此私有字段。使用局部变量。

public List<Job> toList()
        {
            jobs = new List<Job>(); //add this line
            List<JObject> allJobs = o["items"].Select(t => (JObject)t).ToList();
            foreach (JObject i in allJobs)
            {
                Job j = new Job();
                j.name = (string)i["mainInfo"]["name"];
                j.targetCities = i["mainInfo"]["targetCities"].Select(t => (string)t).ToList();
                j.targetStates = i["mainInfo"]["targetStates"].Select(t => (string)t).ToList();
                j.expDate = (string)i["mainInfo"]["expDate"];
                j.skills = i["additionalInfo"]["skills"].Select(t => (string)t).ToList();
                j.homeTime = (string)i["additionalInfo"]["homeTime"];
                this.jobs.Add(j); 
            }
            return this.jobs;
        }

【讨论】:

  • 我其实早就注意到了这一点。我还将作业拉入 toList 方法的范围,而不是将其作为属性。问题实际上是写 API 的开发者在 JSON 中拼写了一堆 keys 错误,而在 API 文档中它们拼写正确。
  • json 也缺少一些括号,我想测试但无法解析。无论如何,错误来自那个变量。
  • 提供的 json 只是简单的模型。我处理的 json 比示例大 50 倍左右。
【解决方案2】:

我认为你可以先定义 allJobs

List<JObject> allJobs = new List<JObject>();
allJobs=o["items"].Select(t => (JObject)t).ToList();

【讨论】:

  • .ToList() 创建并分配一个 List 对象。
  • 你试过我的代码了吗?如果不定义实例,则不会分配内存。
  • 实例是由 ToList 方法定义的。
  • 然而,我的工作对象从未被初始化。我会给你 +1 的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 2013-03-21
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
相关资源
最近更新 更多