读取HttpwebResponse的JSON响应,C#

32

在我的一个应用程序中,我从一个Web请求中获得响应。该服务是Restful服务,将返回类似于下面JSON格式的结果:

{
    "id" : "1lad07",
    "text" : "test",
    "url" : "http:\/\/twitpic.com\/1lacuz",
    "width" : 220,
    "height" : 84,
    "size" : 8722,
    "type" : "png",
    "timestamp" : "Wed, 05 May 2010 16:11:48 +0000",
    "user" : {
        "id" : 12345,
        "screen_name" : "twitpicuser"
    }
}   

这是我的当前代码:

    byte[] bytes = Encoding.GetEncoding(contentEncoding).GetBytes(contents.ToString());
    request.ContentLength = bytes.Length;

    using (var requestStream = request.GetRequestStream()) {

        requestStream.Write(bytes, 0, bytes.Length);

        using (var twitpicResponse = (HttpWebResponse)request.GetResponse()) {

            using (var reader = new StreamReader(twitpicResponse.GetResponseStream())) {

                //What should I do here?

            }

        }

    }

我该如何读取响应? 我想要 URL 和用户名。


1
检查一下Restsharp来进行REST服务调用可能是个好主意。https://github.com/johnsheehan/RestSharp/wiki/Getting-Started在未来会让你的生活轻松100000倍,而且你可以设置对象模型来解码它。 - anthonyvscode
@anthonyvscode,wiki/get-started已经迁移到此处:https://github.com/restsharp/RestSharp/wiki/Getting-Started。 - jaybro
3个回答

58

首先,你需要一个对象。

public class MyObject {
  public string Id {get;set;}
  public string Text {get;set;}
  ...
}

然后在这里

    using (var twitpicResponse = (HttpWebResponse)request.GetResponse()) {

        using (var reader = new StreamReader(twitpicResponse.GetResponseStream())) {
            JavaScriptSerializer js = new JavaScriptSerializer();
            var objText = reader.ReadToEnd();
            MyObject myojb = (MyObject)js.Deserialize(objText,typeof(MyObject));
        }

    }

我没有使用你所拥有的分层对象进行测试,但这将使你能够访问你想要的属性。

JavaScriptSerializer System.Web.Script.Serialization


谢谢回复。老实说,我对这个问题有点懒。几个月前,我创建了一个Google URL缩短API的包装器,并且我也使用了System.Web.Extensions库。 - tugberk
我尝试了你的代码,但是出现了错误:“没有重载方法'Deserialize'接受'2'个参数”,我漏掉了什么吗? - SHEKHAR SHETE
这段代码已经超过3年了。现在可能有更好的方法来做这件事。我也不知道那是哪个版本的JavaScriptSerializer。它可能已经改变了。 - Jason Watts
嘿,我重新启动了这个线程...如果我们有一个字符串数组的数组..那么它的对象结构是什么? - Jean-philippe Emond
4
我建议使用Json.Net来将Json序列化为对象,而不是使用“JavaScriptSerializer”。它更高效,并且现在被Microsoft推荐作为这种工作的序列化器。 - Liam
var myobj = js.Deserialize<MyObject>(objText); 将objText反序列化为MyObject对象并赋值给myobj。 - Yves Rochon

13

我会使用RestSharp - https://github.com/restsharp/RestSharp

创建一个类进行反序列化:

public class MyObject {
    public string Id { get; set; }
    public string Text { get; set; }
    ...
}

获取该对象的代码:

RestClient client = new RestClient("http://whatever.com");
RestRequest request = new RestRequest("path/to/object");
request.AddParameter("id", "123");

// The above code will make a request URL of 
// "http://whatever.com/path/to/object?id=123"
// You can pick and choose what you need

var response = client.Execute<MyObject>(request);

MyObject obj = response.Data;

请查看http://restsharp.org/以开始。


我的响应在内容中获取源而不是数据。 - logeshpalani31

0

如果您正在获取内容中的源代码,请使用以下方法

try
{
    var response = restClient.Execute<List<EmpModel>>(restRequest);

    var jsonContent = response.Content;

    var data = JsonConvert.DeserializeObject<List<EmpModel>>(jsonContent);

    foreach (EmpModel item in data)
    {
        listPassingData?.Add(item);
    }
}
catch (Exception ex)
{
    Console.WriteLine($"Data get mathod problem {ex} ");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接