C# 如何在C中将嵌套的json字符串转换为可访问的结构,以便打印选择项?

C# 如何在C中将嵌套的json字符串转换为可访问的结构,以便打印选择项?,c#,json,C#,Json,我应该使用哪个过程和数据结构来访问C中嵌套JSON字符串中的所有键值对 下图是我正在使用的JSON字符串的一部分。如您所见,它是嵌套的。我正在使用C-Sharp C从每个块中检索日期和消息,并使用它们各自的键 我试着把我的JSON字符串放到字典里 private static async Task<String> ProcessRepo() { var stringTask = APIclient.GetStringAsync("https://a.RESTapi.

我应该使用哪个过程和数据结构来访问C中嵌套JSON字符串中的所有键值对

下图是我正在使用的JSON字符串的一部分。如您所见,它是嵌套的。我正在使用C-Sharp C从每个块中检索日期和消息,并使用它们各自的键

我试着把我的JSON字符串放到字典里

private static async Task<String> ProcessRepo()
{

   var stringTask = APIclient.GetStringAsync("https://a.RESTapi.fakecom"); 
   var x = await stringTask;
   Dictionary<string, object> data = JsonConvert.DeserializeObject<Dictionary<string, object>>(x); 

   return data;
}
这给了我两个键值对。一个是pagelen,值为30,另一个是值,值为一个长字符串中后面的所有内容。不是很有用

这是我第一次使用C。请给我指出正确的方向。我花了很多时间寻找一些有用的东西


反序列化的问题是,您试图将完整的JSON反序列化为键值对字典,但JSON不是这样的,这就是您无法按预期访问值的原因

解决这个问题的两种方法

方法1:

这将以非结构化的方式反序列化完整的json,您将获得每个嵌套json的键和值

方法2: 创建一个与JSON具有相同结构的类

    public class MyJson
    {
        [JsonProperty("pageLen")]
        public int PageLen { get; set; }

        [JsonProperty("values")]
        public Values Values { get; set; }

    }

    public class Values
    {
        [JsonProperty("rendered")]
        public Rendered Rendered { get; set; }

        [JsonProperty("hash")]
        public string Hash { get; set; }
    }

    public class Rendered
    {

    }
然后将其作为反序列化类传递,如下所示

    private static async Task<String> ProcessRepo()
    {
         MyJson data = JsonConvert.DeserializeObject<MyJson>(x);
    }

明确的解决方案取决于您的目标,但最简单的方法是:

var obj = JsonConvert.DeserializeObject(json);
foreach (var jo in (JArray)((JObject)obj)["values"])
{
     Console.WriteLine($"{jo["message"]}, {jo["date"]}");
}

您可以将JSON粘贴到VisualStudio中,它将创建与JSON的布局和数据类型匹配的类。使用Edit->Paste Special->Paste JSON,因为类在反序列化语句中使用它来代替对象。虽然我不确定基于片段的词典是否理想,但我没有Visual Studio。我在运行Linux。我有权访问Visual Studio代码。它有这个功能吗?您也可以使用json2csharp.com根据JSONI获取类如果您想为JSON字符串自动生成类,请参阅。要将JSON加载到没有固定模式的文档对象模型中,请使用JToken.Parse或JObject.Parse,如至中所示。
var obj = JsonConvert.DeserializeObject(json);
foreach (var jo in (JArray)((JObject)obj)["values"])
{
     Console.WriteLine($"{jo["message"]}, {jo["date"]}");
}