我尝试连接外部API。它以JSON结果给出了结果,并且根据我的搜索词,它可以给出零,一个或多于一个结果。
我已经将它映射到C#类,如下所示:
Class Item
- List<ItemResult> Results { get; set; }
- Other properties, such as Name or Description (strings)
每当JSON有一个ItemResult数组(用[]标记)时,它工作正常,当JSON有一个ItemResult(标有{})时,解析会产生错误,因为它需要一个集合或数组。
我的请求如下:
private T DoRequest<T>(string url)
{
try
{
var webRequest = (HttpWebRequest) WebRequest.Create(url);
webRequest.Method = "GET";
webRequest.Accept = "application/json";
webRequest.UserAgent = UserAgent;
var webResponse = webRequest.GetResponse();
using (var streamReader = new StreamReader(webResponse.GetResponseStream()))
{
var responseResult = streamReader.ReadToEnd();
return JsonConvert.DeserializeObject<T>(CorrectJson(responseResult));
}
}
catch (Exception e)
{
UtilityBL.LogError(e.Message);
return default(T);
}
}
我的问题是:如何确保此代码使用ItemResults数组以及单个ItemResult处理JSON结果? 也许我需要手动调整JSON结果?
谢谢!
编辑:
它与此问题类似,但我需要一个.NET解决方案,而不是JQuery或Javascript: How to read both single object & array of objects in json using javascript/jquery
我也尝试过以下代码,但它失败了,因为JsonConvert告诉我现在有2个专辑匹配:
public class Albummatches
{
[JsonProperty("Album")]
public List<Album> Albums { get; set; }
[JsonProperty("Album")]
public Album Album {
set
{
Albums = new List<Album>();
Albums.Add(value);
}
}
}
答案 0 :(得分:2)
我想我明白了! 这是我做的:
创建一个新的JsonConverter: 这将确保我将始终获得一个列表。
public class JsonAlbumConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.StartArray)
return serializer.Deserialize<List<Album>>(reader);
var itm = serializer.Deserialize<Album>(reader);
return new List<Album> {itm};
}
public override bool CanConvert(Type objectType)
{
throw new NotImplementedException();
}
}
通过向属性
应用属性来强制使用我的转换器public class Albummatches
{
[JsonProperty("Album")]
[JsonConverter(typeof(JsonAlbumConverter))]
public List<Album> Albums { get; set; }
}
它有效,但我真的希望有一个内置的解决方案,因为我怀疑这是一个经常出现的问题......
答案 1 :(得分:0)
使用set方法将单个结果作为成员,并覆盖set方法以创建列表并将1项添加到其中。
处理您的单个和多个结果,使用结果的代码只需处理多个结果。
对于您的示例(这是psudeo代码,我不知道确切的语法)
Class Item
- List<ItemResult> Results { get; set; }
- ItemResult Result { set;}
覆盖单个结果的setter,如:
setResult(ItemResult r){
Results = new List<ItemResult>();
Results.add(r);
}