C# Json 到对象字典

标签 c# json json.net deserialization

我想获取一些 Json 并将其解析为键/值对的集合,但某些值本身就是字典。我尝试了通常的Newtonsoft反序列化。很接近,但不太正确。最终结果必须是字典,而不是强类型类。

这是一些 Json 示例:

{
  "JobNumber": 1010,
  "Asset": null,
  "JobNotes": [
    {
      "NoteText": "It's not working.",
      "NoteType": "Complaint"
    },
    {
      "NoteText": "Needs to be fixed",
      "NoteType": "Job"
    }
  ]
}

这是我用来反序列化的代码:

        var json = File.ReadAllText(@"c:\temp\job.json");
        var result = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);

结果几乎是正确的,但是键为“JobNotes”的项目的值只是 json 字符串。我希望解析器递归并将内部 Json 反序列化为字符串和对象的进一步字典。 有没有办法使用 Newtonsoft 库来做到这一点?或者,是否有另一个库可以解决这个问题?我可以连接到解析方法来覆盖该时间点的功能吗?

最佳答案

这是@DanielKeogh 代码的修改版本。效果很好。

class Program
{
    static void Main(string[] args)
    {
        var json = File.ReadAllText(@"c:\temp\job3.json");
        var result = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
        RecurseDeserialize(result);
    }

    private static void RecurseDeserialize(Dictionary<string, object> result)
    {
        //Iterate throgh key/value pairs
        foreach (var keyValuePair in result.ToArray())
        {
            //Check to see if Newtonsoft thinks this is a JArray
            var jarray = keyValuePair.Value as JArray;

            if (jarray != null)
            {
                //We have a JArray

                //Convert JArray back to json and deserialize to a list of dictionaries
                var dictionaries = JsonConvert.DeserializeObject<List<Dictionary<string, object>>>(jarray.ToString()); 

                //Set the result as the dictionary
                result[keyValuePair.Key] = dictionaries;

                //Iterate throught the dictionaries
                foreach (var dictionary in dictionaries)
                {
                    //Recurse
                    RecurseDeserialize(dictionary);
                }
            }
        }
    }
}

这个修改后的 Json 显示了它的深度:

{
  "JobNumber": 1010,
  "Asset": null,
  "JobNotes": [
    {
      "NoteText": "It's not working.",
      "NoteType": "Complaint"
    },
    {
      "NoteText": "Needs to be fixed",
      "NoteType": "Job",
      "JobNoteNotes": [
        {
          "Something": 1,
          "Something2": "Test"
        }
      ]
    }
  ]
}

结果结束了三个字典的深度,以便我可以通过键获取“Something”值。

关于C# Json 到对象字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47045964/

相关文章:

python - 有没有办法使用 JSON 模式在字段之间强制执行值?

asp.net-web-api - Asp.net Web Api 将 UTC 时间字符串反序列化为本地时间

c# - LINQ Web API 上的错误序列化

javascript - json.stringify 没有在主对象下的所有对象上调用 toJson

c# - 有没有一种方法可以测试结合 TestServer 和 moq Mock 来替换 ConfigureTestServices 类中的方法?

c# - 不同的列表<列表<int>>?

c# - 向 ScriptCS 添加默认的 using 指令

javascript - 从 JavaScript 中的循环创建的对象,如何在 json 中分析它们

c# - 用于小写下划线到 CamelCase 的自定义 Json.NET 契约(Contract)解析器

c# - 如何将刻度转换为日期格式?