从服务中调用并获取结果文本

时间:2012-03-05 07:54:05

标签: c# json

我有服务网址:please check it,它返回json字符串。

我不知道如何使用C#

来调用此网址

然后。通过链接,您可以在json数据中看到"href"。它有.png个网址。我想将该图像保存到我的本地磁盘。

问题

  1. 如何从此service

  2. 获取和读取json数据
  3. 如何将图像从网址保存到本地磁盘

3 个答案:

答案 0 :(得分:2)

我想你需要服务器的服务请求而不是客户端的服务请求;如果是这样一个直截了当的方式

string json = null;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/export?bbox=9153621.1267%2C-644273.9207%2C13435472.9966%2C3637577.9492&bboxSR=&layers=&layerdefs=&size=800%2C600&imageSR=&format=png&transparent=false&dpi=&time=&layerTimeOptions=&f=pjson");
HttpWebResponse response = null;

try
{
    response = (HttpWebResponse)request.GetResponse();
    var responseStream = response.GetResponseStream();

    if ((responseStream != null) && responseStream.CanRead)
    {
        using (var reader = new System.IO.StreamReader(responseStream))
        {
            json = reader.ReadToEnd();
        }
    }
}
finally
{
    if (response != null)
    {
        response.Close();
    }
}

图像可以通过相同的方式获得。

对于Json,我建议JSON.NET

答案 1 :(得分:1)

使用数据合约和DataContractJsonSerializer

所需参考:

using System.Runtime.Serialization;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Net;

数据合同

[DataContract]
internal class GISData
{
    [DataMember]
    public string href;

    [DataMember]
    public int width;

    [DataMember]
    public int height;

    [DataMember]
    public GISDataExtent extent;

    [DataMember]
    public string scale;
}

[DataContract]
internal class GISDataExtent
{
    [DataMember]
    public string xmin;

    [DataMember]
    public string ymin;

    [DataMember]
    public string xmax;

    [DataMember]
    public string ymax;

    [DataMember]
    public GISDataExtentSpatialReference spatialReference;

}

[DataContract]
internal class GISDataExtentSpatialReference
{
    [DataMember]
    public string wkid;
}

将所有内容放在一起并下载文件:

从您的网址中提取JSON字符串 - 反序列化对象并下载您的图片。

WebClient webClient;
webClient = new WebClient();
string json = webClient.DownloadString(@"http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/export?bbox=9153621.1267%2C-644273.9207%2C13435472.9966%2C3637577.9492&bboxSR=&layers=&layerdefs=&size=800%2C600&imageSR=&format=png&transparent=false&dpi=&time=&layerTimeOptions=&f=pjson");

MemoryStream stream = new MemoryStream((Encoding.UTF8.GetBytes(json)));
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(GISData));
stream.Position = 0;
GISData data = (GISData)ser.ReadObject(stream);
stream.Close();

webClient = new WebClient();
webClient.DownloadFile(data.href, "C:/" + data.href.Substring(data.href.LastIndexOf("/") + 1)); //Save only the filename and not the entire URL as a name.

答案 2 :(得分:1)

  1. 添加Json.NET包(参见参考How to install JSON.NET using NuGet?
  2. 使用以下代码:

    using Newtonsoft.Json;
    
    ......
    
    string url = "...";
    
    var webClient = new WebClient();
    var s = webClient.DownloadString(url);
    dynamic d = JsonConvert.DeserializeObject(s);
    var href = ((string) d.href);
    
    webClient.DownloadFile(href, @"d:\file.png");
    
  3. 请注意,您的png文件不存在:)

    如果需要,您可以创建POCO课程。但如果你只需要下载一个文件 - 可能就不需要了。