[英]Parsing JSON from API - C#
我正在从标准Web服务请求JSON,因此我需要处理响应,以便可以使用对象。 我在Xamarin Studio中工作-并不是我认为那很重要。
您可以通过以下网址查看来自Web服务的结果: https : //dawa.aws.dk/vejnavne/autocomplete?q= due这是在丹麦请求带有“ due”字样的街道名称。
public async Task doAsyncAddress(string input)
{
var template = "https://dawa.aws.dk/vejnavne/autocomplete?q={0}";
var url = string.Format(template, input);
using (var httpClient = new HttpClient())
{
try
{
Task<HttpResponseMessage> getResponse = httpClient.GetAsync(url);
HttpResponseMessage response = await getResponse;
var responseJsonString = await response.Content.ReadAsStringAsync();
/*
我在这里尝试了不同的方法,使用了JsonConvert和JObject,但是都没有用。 我可以看到字符串,所以我知道它在那儿。但是它的格式不正确。
*/
}
catch (Exception ex)
{
string message = ex.Message;
return message;
}
}
}
使用JsonConverter.DeserializeObject我这样做:
var adress = JsonConvert.DeserializeObject<List<Address>>(responseJsonString);
地址:
public class Address
{
public string tekst { get; set; }
public List<Vejnavne> vejnavn
{ get; set; }
}
public class Vejnavne
{
public string href { get; set; }
public string navn { get; set; }
}
响应是:
“无法反序列化当前JSON对象(例如{\\“ name \\”:\\“ value \\”})为类型'System.Collections.Generic.List`1 [MinEjendom.Vejnavne]',因为该类型需要JSON数组(例如[1,2,3])才能正确反序列化。\\ n要解决此错误,可以将JSON更改为JSON数组(例如[1,2,3]),也可以更改反序列化类型,使其成为普通的.NET类型(例如,不是可以从JSON对象反序列化的诸如整数之类的原始类型,而不是诸如数组或List之类的集合类型),还可以将JsonObjectAttribute添加到该类型中以强制其对JSON对象的反序列化代码反序列化。 [0] .vejnavn.href',第5行,位置11。”
有了JObject,我得到:
“从JsonReader读取JObject时出错。当前的JsonReader项不是对象:StartArray。Path,第1行,位置1。”
您的C#代码错误。 这是正确的:
public class Vejnavn
{
public string href { get; set; }
public string navn { get; set; } // not List<Vejnavne> vejnavn
}
public class Address
{
public string tekst { get; set; }
public Vejnavn vejnavn { get; set; }
}
然后这样称呼它:
var adress = JsonConvert.DeserializeObject<List<Address>>(responseJsonString);
使用JSON时,您是.NET开发人员,最后-您必须将JSON转换为C#类,您应该使用Edit-> Paste Special-> Paste JSON作为类。 这是一个很棒的工具:)
您的代码是错误的。 这是从JSON生成的类:
public class Class1
{
public string tekst { get; set; }
public Vejnavn vejnavn { get; set; }
}
public class Vejnavn
{
public string href { get; set; }
public string navn { get; set; }
}
成功生成代码后,可以重命名该类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.