首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定json是c#中的数组或对象的通用方法

确定json是c#中的数组或对象的通用方法
EN

Stack Overflow用户
提问于 2018-09-27 06:21:49
回答 2查看 2.1K关注 0票数 2

我的项目包含太多对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对象反序列化。

因此,为了解决这个问题,我需要能够处理上述两种情况的通用方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-27 06:39:15

我想要能够处理上述两种情况的通用方法。

下面的泛型方法可以将传入的json解析为objectList<object>

代码语言:javascript
复制
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;
        }
    }
}

您可以使用上面的泛型方法,如下所示。我为您的演示创建了一个控制台应用程序。

代码语言:javascript
复制
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。

代码语言:javascript
复制
public class User
{
    public string Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

输出:

1)通过对对象数组使用json

代码语言:javascript
复制
string json1 = @"[{'Id':'1','Name':'Mike','Age':43},{'Id':'2','Name':'Anna','Age':56}]";

2)仅对对象使用json。

代码语言:javascript
复制
string json2 = @"{'Id':'3','Name':'John','Age':24}";

替代

下面的泛型方法可以将传入的json解析为objectList<object>并返回List<object>

代码语言:javascript
复制
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>();
    }
}

您可以使用上面的泛型方法,如下所示。

代码语言:javascript
复制
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();
    }
}
票数 3
EN

Stack Overflow用户

发布于 2018-09-27 07:57:07

如果我们必须处理不同的类型,而不仅仅是通过Arrayobject,下面是我的方法:(注意,我是using Newtonsoft.Json)

methods1

代码语言:javascript
复制
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;
}

然后像这样使用它:

代码语言:javascript
复制
 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

代码语言:javascript
复制
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;
    }
}

并把它当作:

代码语言:javascript
复制
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>;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52530641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档