使用JSON.NET解析复杂的JSON文本

本文关键字:JSON 文本 复杂 NET 使用 | 更新日期: 2023-09-27 17:58:11

我正在编写一个程序来访问Mediafire的web API,一切都很顺利,唯一剩下的问题是JSON格式的响应文本,我很难解析。

通过创建文件夹等API调用,我得到了一个简单的响应,可以将其反序列化为Dictionary<string,Dictionary<string,string>>并搜索值:

{"response":
    {
    "action":"folder'/create.php",
    "name":"blargh",
    "folder_key":"mmttuu769djo0",
    "result":"Success",
    "current_api_version":"2.14"
    }
}

我会这样使用它:

Dictionary<string,string> json = DeserializeJSON(text)["response"];
//DeserializeJSON is a method to shorten:
//JsonConvert.DeserializeObject<Dictionary<string,Dictionary<string,string>>(text)

然后我可以查询json["result"]之类的内容。对于其他API调用,我得到了复杂的结构,我不知道如何处理。它基本上是一堆key:value对,但其中一些值也是key:value,不能像我目前所做的那样放入字典中。我对C#还很陌生,所以我不知道该怎么办,有没有其他数据类型,比如Dictionary,没有静态类型?

以下是回应:

{"response":
    {
    "action":"upload'/upload.php",
    "doupload":
        {
        "result":"0",
        "key":"89lh7760x4l"
        },
    "server":"live",
    "result":"Success",
    "current_api_version":"2.14"
    }
}

我的问题是:将这类数据放入一个可以查询值的列表中的好方法是什么?

使用JSON.NET解析复杂的JSON文本

创建一个新类来处理json怎么样?您可以使用json2csharp生成类,并使用示例json。

public class Doupload
{
    public string result { get; set; }
    public string key { get; set; }
}
public class Response
{
    public string action { get; set; }
    public Doupload doupload { get; set; }
    public string server { get; set; }
    public string result { get; set; }
    public string current_api_version { get; set; }
}
public class RootObject
{
    public Response response { get; set; }
}

然后您可以使用:取消json的序列化

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
var something = serializer.Deserialize<RootObject>(jsonString);

我最终发现了dynamic类型-将文本反序列化为Dictionary<string,dynamic>允许它有多种类型,其中一些类型也可以是字典。我可以按预期查询它,但我只需要确定每次API调用返回的值,并且我需要将其强制转换为字符串。

string upload_key = (string)json["response"]["doupload"]["key"] //89lh7760x4l