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

时间:2015-03-31 23:40:11

标签: json c#-4.0 json.net

我如何解析这个json响应并创建c#object

{"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,它将返回文件列表或者我可以将此响应反序列化为c#类吗?

三江源

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

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的回答,我能够快速有效地实施通用解决方案。谢谢

https://dotnetfiddle.net/tC0Dws

2 个答案:

答案 0 :(得分:2)

尝试像这样定义你的类:

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();
}

小提琴:https://dotnetfiddle.net/vpre5H

答案 1 :(得分:1)

根据你提供的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; }
}

为了简化测试,我将您的样本用作字符串,但您可以轻松使用网址或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);
    }
}

这就是结果:

enter image description here