首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >响应现有请求解析JSON

响应现有请求解析JSON
EN

Stack Overflow用户
提问于 2014-10-29 07:16:58
回答 2查看 150关注 0票数 1

嗨,我有一个来自web服务的回复,我想有一个来自响应的单个url。我的答复是以下格式。

代码语言:javascript
复制
[{"cdn_streaming_uri": "9e849cfbb2e157-22558a0600b387d0abe240fe5.r73.stream..rackcdn.com", "name": "test1", "cdn_ios_uri": "d3d4c27-22558a0600b387d0abc071d0ae240kcdn.com", "cdn_ssl_uri": "https://990fea26e-22558a0600b387d0abc071d0ae240fe5.ssl.cdn.com", "cdn_enabled": false, "ttl": 259200, "log_retention": false, "cdn_uri": "99b56a009-22558a0600b3c071d0ae240fe5.r73.n.com"}, {"cdn_streaming_uri": "74ec8c-d5edc6cad91792413b1b134fde.r46.stcdn.com", "name": "test2", "cdn_ios_uri": "d05437e44-d5edc61792413b1b134fde.iosr.cdn.com", "cdn_ssl_uri": "https://a1c2ebbf5-d5edc6cd91792413b1b134fde.scdn.com", "cdn_enabled": false, "ttl": 259200, "log_retention": false, "cdn_uri": "72ffd-d5edc6ca16852413b1b134fde.cdn.com"}, {"cdn_streaming_uri": "93665b76-550971032c2a22cdn.com", "name": "test3", "cdn_ios_uri": "ca6b-550971032c2fbf19452d6a.iosr.cf2.rackcdn.com", "cdn_ssl_uri": "https://c7c39-550971032cbf19452d6cdn.com", "cdn_enabled": true, "ttl": 86400, "log_retention": true, "cdn_uri": "68fc6d831a94-550971032c252d6a.r3cdn.com"}]

我需要用"cdn_streaming_uri“来代替"test3”。

您可以在http://json.parser.online.fr/中查看JSON解析器,如何解析它?

这是我的代码:

代码语言:javascript
复制
public static object getTokenResponse(String PrivateURL, string ResponseType)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(PrivateURL +"?format=JSON");
    request.Method = "GET";
    request.Headers.Add("X-Auth-Token", id);
    //request.ContentType = "application/XML";

    HttpWebResponse resp1;
    try
    {
        resp1 = (HttpWebResponse)request.GetResponse();
    }
    catch (Exception exp)
    {
        string[] st = new string[0];
        return st;
    }


    StreamReader reader = new StreamReader(resp1.GetResponseStream());
    string  secondresponse = reader.ReadToEnd();
    Console.WriteLine(secondresponse);
    reader.Close();

    JavaScriptSerializer json_serializer = new JavaScriptSerializer();
    object obj1 = json_serializer.DeserializeObject(secondresponse);
}

我可以在obj1中看到反应。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-29 07:46:14

我认为,最好的方法是创建代表您的响应的类。最简单的方法是使用Visual的EDIT -> Paste Special -> Paste JSON As Classes选项:

您只需复制响应并将其粘贴为JSON类即可。Visual将为您生成模型。在这种情况下,结果将是:

代码语言:javascript
复制
namespace ConsoleApplication91
{
    public class Rootobject
    {
        public Class1[] Property1 { get; set; }
    }

    public class Class1
    {
        public string cdn_streaming_uri { get; set; }
        public string name { get; set; }
        public string cdn_ios_uri { get; set; }
        public string cdn_ssl_uri { get; set; }
        public bool cdn_enabled { get; set; }
        public int ttl { get; set; }
        public bool log_retention { get; set; }
        public string cdn_uri { get; set; }
    }
}

当然,这看起来不太好,但是我们总是欢迎您重构这段代码。当您拥有您的模型时,您可以下载您的响应,解析它并使用linq获取所需的内容,例如:

代码语言:javascript
复制
using (var client = new WebClient())
{
    var url = "your service url";
    var serializer = new JavaScriptSerializer();

    // Response in JSON format
    var respJson = client.DownloadString(url);

    // Deserialized response
    var resp = serializer.Deserialize<Rootobject>(respJson);

    // Your requested result
    var result = resp.Property1.FirstOrDefault(o => o.name == "test3").cdn_streaming_uri;
}

编辑:

在重构(使用DataMember属性和删除冗余模型对象)之后,您可以拥有以下模型:

代码语言:javascript
复制
[DataContract]
public class Model
{
    [DataMember(Name = "cdn_streaming_uri")]
    public string CdnStreamingUri { get; set; }

    [DataMember(Name = "name")]
    public string Name { get; set; }

    [DataMember(Name = "cdn_ios_uri")]
    public string CdnIosUri { get; set; }

    [DataMember(Name = "cdn_ssl_uri")]
    public string CdnSslUri { get; set; }

    [DataMember(Name = "cdn_enabled")]
    public bool CdnEnabled { get; set; }

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

    [DataMember(Name = "log_retention")]
    public bool LogRetention { get; set; }

    [DataMember(Name = "cdn_uri")]
    public string CdnUri { get; set; }
}

经过一些研究,我发现JavascriptSerializer有点不受欢迎,它不支持任何类型的DataMemberAttributes。因此,我建议使用DataContractJsonSerializer。它比JavascriptSerializer稍微混乱一些,但我认为它是好的。如果您不关心任何代码约定,您可以和平地使用firs提供的选项(带有JavaScriptSerializer而没有DataMember属性)。不要忘记更新结果查询:

代码语言:javascript
复制
using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(respJson)))
{
    var serializer = new DataContractJsonSerializer(typeof(Model[]));
    var resp = serializer.ReadObject(ms) as Model[];

    var result = resp.FirstOrDefault(o => o.Name == "test3").CdnStreamingUri;
}

但是,如果您不想使用linq (我仍然强烈推荐),您可以创建一些函数来找到您需要的CdnStreamingUri

代码语言:javascript
复制
public static class Extensions
{
    public static string GetCdnStreamingUriFor(this Model[] input, string name)
    {
        foreach (var model in input)
        {
            if (model.Name == name)
                return model.CdnStreamingUri;
        }

        return string.Empty;
    }
}

结果查询将如下所示:

代码语言:javascript
复制
var result = resp.GetCdnStreamingUriFor("test3");

P.S.所有已使用名称空间的完整列表:

代码语言:javascript
复制
using System;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Runtime.Serialization;
票数 9
EN

Stack Overflow用户

发布于 2014-10-29 07:40:27

我建议您为该json生成类,如下面(http://json2csharp.com/ )所示:

代码语言:javascript
复制
public class RootObject
{
    public string cdn_streaming_uri { get; set; }
    public string name { get; set; }
    public string cdn_ios_uri { get; set; }
    public string cdn_ssl_uri { get; set; }
    public bool cdn_enabled { get; set; }
    public int ttl { get; set; }
    public bool log_retention { get; set; }
    public string cdn_uri { get; set; }
}

之后,可以反序列化强类型对象http://msdn.microsoft.com/en-us/library/bb355316(v=vs.110).aspx

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26624651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档