我的项目包含太多对rest的调用,有时我得到json数组和json对象。
当前,我必须为每个调用编写相同的重复代码,以确定响应json是数组还是对象。
所以我面对下面的错误,因为我不知道传入的json类型。
无法将当前JSON数组(例如,1,2,3)反序列化为'userList‘类型,因为该类型需要一个JSON对象(例如{“名称”:“值”})才能正确反序列化。要修复此错误,要么将JSON更改为JSON对象(例如,{"name":"value"}),要么将反序列化类型更改为数组,或者将实现集合接口(例如ICollection、IList)的类型改为可以从JSON数组反序列化的列表。还可以将JsonArrayAttribute添加到类型中,以强制它从JSON数组反序列化
或
无法将当前JSON对象(例如,{“名称”:“值”})反序列化为'System.Collections.Generic.List`1MvcSumit1.Models.User‘类型,因为该类型需要一个JSON数组(例如,1,2,3)才能正确反序列化。要修复此错误,要么将JSON更改为JSON数组(例如,1,2,3),要么更改反序列化类型,使之成为可以从JSON对象反序列化的普通.NET类型(例如,不像整数这样的原始类型,而不是数组或列表之类的集合类型)。还可以将JsonObjectAttribute添加到类型中,以强制它从JSON对象反序列化。
因此,为了解决这个问题,我需要能够处理上述两种情况的通用方法。
发布于 2018-09-27 06:39:15
我想要能够处理上述两种情况的通用方法。
下面的泛型方法可以将传入的json解析为object或List<object>。
public class Utility
{
public static object JsonParser<T>(string json)
{
try
{
JToken jToken = JToken.Parse(json);
if (jToken is JArray)
return jToken.ToObject<List<T>>();
else if (jToken is JObject)
return jToken.ToObject<T>();
else
return "Unable to cast json to unknown type";
}
catch (JsonReaderException jex)
{
return jex.Message;
}
catch (Exception ex)
{
return ex.Message;
}
}
}您可以使用上面的泛型方法,如下所示。我为您的演示创建了一个控制台应用程序。
class Program
{
static void Main(string[] args)
{
var result = Utility.JsonParser<User>("You json either object or array");
if (result is List<User>)
{
var userList = result as List<User>;
userList.ForEach(user => Console.WriteLine($"Id: {user.Id}, Name: {user.Name}, Age: {user.Age}"));
}
else if (result is User)
{
var user = result as User;
Console.WriteLine($"Id: {user.Id}, Name: {user.Name}, Age: {user.Age}");
}
else if (result is string)
{
Console.WriteLine(result);
}
Console.ReadLine();
}
}Sample类用于反序列化json。
public class User
{
public string Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}输出:
1)通过对对象数组使用json
string json1 = @"[{'Id':'1','Name':'Mike','Age':43},{'Id':'2','Name':'Anna','Age':56}]";

2)仅对对象使用json。
string json2 = @"{'Id':'3','Name':'John','Age':24}";

替代
下面的泛型方法可以将传入的json解析为object或List<object>并返回List<object>。
public class Utility
{
public static List<T> JsonParser<T>(string json)
{
JToken jToken = JToken.Parse(json);
if (jToken is JArray)
{
return jToken.ToObject<List<T>>();
}
else if (jToken is JObject)
{
List<T> lst = new List<T>();
lst.Add(jToken.ToObject<T>());
return lst;
}
else
return new List<T>();
}
}您可以使用上面的泛型方法,如下所示。
class Program
{
static void Main(string[] args)
{
var userList = Utility.JsonParser<User>("You json either object or array");
if (userList.Count > 0)
{
userList.ForEach(user => Console.WriteLine($"Id: {user.Id}, Name: {user.Name}, Age: {user.Age}"));
}
else
{
//Do code here if your list is empty
}
Console.ReadLine();
}
}发布于 2018-09-27 07:57:07
如果我们必须处理不同的类型,而不仅仅是通过Array或object,下面是我的方法:(注意,我是using Newtonsoft.Json)
methods1
public bool TryDeserialize(string json, out object target, params Type[] types)
{
foreach (Type type in types)
{
try
{
target = JsonConvert.DeserializeObject(json, type);
return true;
}
catch (Exception)
{
}
}
target = null;
return false;
}然后像这样使用它:
object obj = null;
Type[] types = new Type[] { typeof(TypeA), typeof(List<TypeB>) };
if (TryDeserialize(json, out obj, types))
{
if (obj is TypeA)
{
var r = obj as TypeA;
}
else
{
var r = obj as List<TypeB>;
}
}或方法2
public bool TryDeserialize<T1, T2>(string json, out object target)
{
try
{
target = JsonConvert.DeserializeObject<T1>(json);
return true;
}
catch (Exception)
{
}
try
{
target = JsonConvert.DeserializeObject<T2>(json);
return true;
}
catch (Exception)
{
target = null;
return false;
}
}并把它当作:
object obj = null;
if (TryDeserialize<TypeA, List<TypeB>>(json, out obj))
{
if (obj is TypeA)
{
var r = obj as TypeA;
}
else
{
var r = obj as List<TypeB>;
}
}https://stackoverflow.com/questions/52530641
复制相似问题