我有一些具有INT结果的JSON,可以作为单个INT或INT的LIST返回..即:
"错误码":[3]
或
" ErrorCode":1
如何使用Newstonsoft.Json的JsonConvert进行反序列化?
如果我将对象定义为LIST,则当结果为单个INT时会失败,反之亦然。
答案 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>());