解析 Json 响应并创建文件列表

Parse Json response and create List of files

我如何解析这个 json 响应并创建 C# 对象

{"Response":"valid","Files":{"0":{"FileURL":"htp:\/\/somedomain.com\/1.exe","FileVersion":1},"1":{"FileURL":"htp:\/\/somedomain.com\/1.exe","FileVersion":2}}}

我有 C# class

public class Files
{
public string fileURL;
public string fileVersion;
}


WebClient wc=new WebClient();
string code=wc.DownloadString("http://somedomain.com/GetLatestFiles.php");
List<Files> f=ParseJson(code);

我该如何解析这个json请帮忙。我需要实现 ParseJson,它将 return 文件列表或者我可以将此响应反序列化为 c# class?

谢谢

编辑实现了一些解决方案,但速度很慢?

public class LatestFile
    {
        public string fileURL;
        public string fileVersion;
    }


private List<LatestFile> ParseJson(string code)
        {
            List<LatestFile> files = new List<LatestFile>();

            dynamic jObj = JsonConvert.DeserializeObject(code);

            foreach (var child in jObj.Files.Children())
            {
                string index = child.Name;
                string url = child.First.FileURL.Value;
                string version = child.First.FileVersion.Value.ToString();
                LatestFile f = new LatestFile();
                f.fileURL = url;
                f.fileVersion = version;
                files.Add(f);

            }
            return files;
        }

基于下面@Brian Rogers 的回答,我能够快速实施通用解决方案并且 efficiently.Thanks

https://dotnetfiddle.net/tC0Dws

尝试这样定义您的 类:

public class RootObject
{
    public string Response { get; set; }
    public Dictionary<string, LatestFile> Files { get; set; }
}

public class LatestFile
{
    public string FileURL { get; set; }
    public string FileVersion { get; set; }
}

并像这样制作你的辅助方法:

private List<LatestFile> ParseJson(string json)
{
    RootObject obj = JsonConvert.DeserializeObject<RootObject>(json);
    return obj.Files.Values.ToList();
}

Fiddle: https://dotnetfiddle.net/vpre5H

根据您提供的 JSON,您在那里拥有三个不同的对象。首先是 ResponseFiles 字段。其次 - 它看起来像是一个集合,但在当前的实现中它是一个对象 - 具有字段 01。第三个字段为 FileURLFileVersion.

您可以使用从 .Net 4.5 开始可用的 DataContractJsonSerializer。它在 System.Runtime.Serialization.Json 命名空间中。

要解析您的 JSON,您需要以下数据结构:

[DataContract]
public class JsonResponse
{
    [DataMember(Name = "Response")]
    public string Response { get; set; }

    [DataMember(Name = "Files")]
    public Files Files { get; set; }
}
[DataContract]
public class Files
{
    [DataMember(Name = "0")]
    public MyFile Frst { get; set; }

    [DataMember(Name = "1")]
    public MyFile Scnd { get; set; }
}

[DataContract]
public class MyFile
{
    [DataMember(Name = "FileURL")]
    public string FileURL { get; set; }

    [DataMember(Name = "FileVersion")]
    public int FileVersion { get; set; }
}

为了使测试更容易,我将您的样本用作字符串,但您可以轻松地使用 URL 或 Stream:

static string json = @"
{
    ""Response"":""valid"",
    ""Files"":
    {
        ""0"":
        {
            ""FileURL"":""htp:\/\/somedomain.com\/1.exe"",""FileVersion"":""1""
        },
        ""1"":
        {
            ""FileURL"":""htp:\/\/somedomain.com\/1.exe"",""FileVersion"":""2""
        }
    }
}";

static void Main(string[] args)
{
    var serializer = new DataContractJsonSerializer(typeof(JsonResponse));

    DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(JsonResponse));
    using (MemoryStream ms = new MemoryStream(System.Text.ASCIIEncoding.ASCII.GetBytes(json)))
    {
        JsonResponse response = (JsonResponse)js.ReadObject(ms);
    }
}

这就是结果: