Newstonsoft.Json反序列化可能导致LIST<>的INT。

时间:2017-04-03 20:00:38

标签: c# json

我有一些具有INT结果的JSON,可以作为单个INT或INT的LIST返回..即:

"错误码":[3]

" ErrorCode":1

如何使用Newstonsoft.Json的JsonConvert进行反序列化?

如果我将对象定义为LIST,则当结果为单个INT时会失败,反之亦然。

3 个答案:

答案 0 :(得分:2)

我认为您需要确定json的数据类型。也许总是让它返回一个数组,这样就不会有INT。所以,你的json看起来像这样:

"ErrorCode":[3]

然后任何单个错误代码都只是一个大小为1的数组。

答案 1 :(得分:0)

您可以创建一个类:

MyResult r = JsonConvert.Deserialize<MyResult>(json);
List<int> errorCodes;
if (r.ErrorCode is JArray) {
    errorCodes = (r.ErrorCode as JArray).ToObject<List<int>>();
   // ...
} else {
   errorCodes = new List<int> { Convert.ToInt32(r.ErrorCode) };
   // ...
}

并使用它来反序列化你的json:

@app.route('/analytics/signals/<ticker_url>')
def analytics_signals_aapl_page(ticker_url):
    all_ticker = full_list
    ticker_name = com_name
    ticker = ticker_url.upper()
    return render_template('company.html', all_ticker=all_ticker, ticker_name=ticker_name, ticker=ticker)

希望它有所帮助。

答案 2 :(得分:0)

您可以创建自定义json转换器:

class ResolveListConverter<T> : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        List<T> list = new List<T>();
        if (reader.TokenType == JsonToken.StartArray)
        {
            reader.Read();
            while (reader.Value != null)
            {
                list.Add(Converter(reader.Value));
                reader.Read();
            }
        }
        else if(reader.Value != null)
        {
            list.Add(Converter(reader.Value));
        }
        return list;
    }

    public T Converter(object obj) => (T)Convert.ChangeType(obj, typeof(T));

    public override bool CanConvert(Type objectType) => true;
}

然后你可以反序列化你的json:

var result = JsonConvert.DeserializeObject<List<int>>(json, new ResolveListConverter<int>());