2016-09-25 91 views
0

我第一次使用WebClient。当我做了以下为什么C#为我的数据添加额外的反斜杠?

var raw = new WebClient().DownloadString("http://ip-api.com/json"); 

,只是测试方法在浏览器中正常显示它作为字符串:

public string GetLocationData() 
{ 
     var raw = new WebClient().DownloadString("http://ip-api.com/json"); 
     return raw; 
} 

然而,现实需要的方法与额外的反斜杠返回

public ActionResult GetLocationDataInJson() 
{ 
     return Json(GetLocationData(), JsonRequestBehavior.AllowGet); 
} 

回报我

"{\"as\":\"AS6584 Microsoft Corporation\",\"city\":\"Dublin\",\"country\":\"Ireland\",\"countryCode\":\"IE\",\"isp\":\"Microsoft Limited\",\"lat\":53.3331,\"lon\":-6.2489,\"org\":\"Microsoft Corporation\",\"query\":\"194.69.98.180\",\"region\":\"L\",\"regionName\":\"Leinster\",\"status\":\"success\",\"timezone\":\"Europe/Dublin\",\"zip\":\"\"}" 

所以我不能使用这些数据通过MicrosoftJson进行处理。我如何获得正常的Json数据?我试过String.Replace(),但它不起作用。

更新: 当我尝试我的原始字符串发送到另一个方法

public class LocationData 
{ 
    public LocationData(string json) 
    { 
     JObject jObject = JObject.Parse(json); 
     JToken location = jObject["LocationData"]; 
     Latitude = (string)location[@"lat"]; 
     Longitude = (string)location[@"lon"]; 
    } 

    public string Latitude { get; set; } 
    public string Longitude { get; set; } 

} 

它抛出一个异常,并说无法找到同样的情况“LAT”或“经度”;调试器在带有反斜杠的LocationData的构造函数方法中显示此输入字符串。

我读了另一个关于逐字串和“@”用法的问题。它不起作用。

+1

您已经下载一个JSON对象,所以它包裹在'JSON()'再次将JSON-逃避一切,这就是你所看到的(逃引用字符串中的引号等)。您可能想要返回原始字符串。尝试'返回内容(GetLocationData()));'。 –

+1

@MaximilianGerhardt哦,等等......如果返回的字符串实际上是OP得到的,而不是调试器显示的内容,那么它不是我已经关闭它的副本。重开。 – hvd

+1

双重转义来自已经JSON编码的对象上的Json()调用,或者调试器向他显示的内容,在这种情况下没有问题。 –

回答

1

我想你可以试试这个方法

var raw = new WebClient().DownloadString("http://ip-api.com/json"); 

    var json = JToken.Parse(raw.ToString()); 

    string Latitude = (string)json[@"lat"]; 
    string Longitude = (string)json[@"lon"]; 
相关问题