У меня есть данные, хранящиеся в поле БД, действующем как кеш из вызова API. Эти данные относятся к одному из следующих типов:
MyObjectList<MyObject>В настоящее время у меня есть следующий код, который использует NewtonSoft.JSON, чтобы взять строку и (на основе успешной десериализации) определить, к какому из этих типов относится строка.
var _lstObj = new List<MyObject>();
var _obj = new MyObject();
bool isList = false;
try
{
var n = JsonConvert.DeserializeObject<List<MyObject>>(cacheString);
if (n!=null && n.Count()>0)
{
_lstObj = n;
isList = true;
}
}
catch(Exception e)
{
isList = false;
}
if (!isList)
{
try
{
var x = JsonConvert.DeserializeObject<MyObject>(cacheString);
if (x != null && x.Data != null)
{
_obj = x;
}
}
catch(Exception e) { }
}
Это кажется громоздким... есть ли лучший способ сделать это?
У меня всегда будет строка для входящих данных.
Это будет только 1 из этих 2 типов.





Сначала проверьте, является ли строка json списком, чтобы решить проблему.
if (cacheString.StartsWith("["))
{
var myList = JsonConvert.DeserializeObject<List<MyObject>>(cacheString);
}
else
{
var myObject = JsonConvert.DeserializeObject<MyObject>(cacheString);
}
Это должно работать:
var obj = (JToken)JsonConvert.DeserializeObject(cacheString);
if (obj.Type == JTokenType.Array)
{
var result = obj.ToObject<List<MyObject>>();
}
else
{
var result = obj.ToObject<MyObject>();
}
Можно заменить (JToken)JsonConvert.DeserializeObject(cacheString) на JToken.Parse(cacheString)
Я бы использовал объект expando, таким образом вы можете продолжать добавлять свойства, если хотите динамически.
dynamic exp = new ExpandoObject();
try
{
exp.isList = true;
exp.value = JsonConvert.DeserializeObject<List<MyObject>>(cacheString);
}
catch (Exception e)
{
exp.isList = false;
exp.value = JsonConvert.DeserializeObject<MyObject>(cacheString);
}
но в идеале я бы кэшировал объект как список, независимо от того, один он или много.
Хороший. Мне нравится, как это выглядит. Я попробую