JSON结果可以有数组或单个值 - 错误解析

时间:2014-08-31 13:40:07

标签: c# arrays json parsing json.net

我尝试连接外部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);
        }
    }
}

2 个答案:

答案 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);
}