【问题标题】:how to assign JSON array of object data to appropriate list of T如何将对象数据的 JSON 数组分配给适当的 T 列表
【发布时间】:2019-02-28 15:56:20
【问题描述】:

我有两种类型的 SalesData 和 CollectionData。这两种类型是完全不同的类型。因此,当我将数据传递给前端时,我创建了动态数据类型并根据调用将数据传递给前端。

在接收数据时,我创建了 json 数据,它是对象数组。

现在我处于如何根据类型将传入数组分配给 List 或 List 的情况。

这就是我所做的。

public ActionResult DownloadDataInExcel(List<object>data, int type)
        {
            if (type == (int)MyEnum.Sales)
            {
                var mycontacts = JsonConvert.DeserializeObject<List<SalesData>>(data.ToString());

                foreach (var item in mycontacts)
                {
                    System.Diagnostics.Debug.WriteLine($"{item.Name}-{item.City}-{item.Country}");
                }
            }else
            {
                var mycontacts = JsonConvert.DeserializeObject<List<CollectionData>>(data.ToString());

                foreach (var item in mycontacts)
                {
                    System.Diagnostics.Debug.WriteLine($"{item.Name}-{item.City}-{item.Country}");
                }
            }

            //to do: Convert data to Excel File

            throw new NotImplementedException();

        }

【问题讨论】:

  • 您是否成功地将您的 json 反序列化为 SalesDataCollectionData 类型?
  • 没有。我认为问题是我从 ajax 传递数组数组。
  • 请为 SalesData 和 CollectionData 编写 JSON 和类。你可能在结构上有问题。如果您提供完整的信息,我们可以提供帮助
  • 问题是我通过 ajax 传递的数据导致了错误。我在字符串化后传递了 json 对象,并在我的方法中作为字符串接收。 "public ActionResult DownloadDataInExcel(string data, int type)".
  • 我想问一个问题是,你不知道传入的 json 数据类型和你想反序列化为 SalesData 或 CollectionData 类型的操作方法?

标签: c# asp.net-mvc dynamic


【解决方案1】:

1) 您需要一个通用方法将传入的 json 反序列化为适当的 List&lt;&gt; 对象

public static List<T> DeserializeList<T>(string json)
{
    return JsonConvert.DeserializeObject<List<T>>(json);
}

2) 我在这里创建了一个控制台应用程序用于您的演示。

class Program
{
    static void Main(string[] args)
    {
        string json1 = @"[{'Id1':'1','Name1':'Mike','Age1':43},{'Id1':'2','Name1':'Anna','Age1':56}]";
        string json2 = @"[{'Id2':'1','Name2':'Mike','Age2':43},{'Id2':'2','Name2':'Anna','Age2':56}]";

        //Pass json1 and deserialize into list of Sample1
        var sample1List = DeserializeList<Sample1>(json1);
        sample1List.ForEach(x => Console.WriteLine($"Id1: {x.Id1},  Name1: {x.Name1}, Age1: {x.Age1}"));

        Console.WriteLine("\n");

        //Pass json2 and deserialize into list of Sample2
        var sample2List = DeserializeList<Sample2>(json2);
        sample2List.ForEach(x => Console.WriteLine($"Id2: {x.Id2},  Name2: {x.Name2}, Age2: {x.Age2}"));

        Console.ReadLine();
    }

    public static List<T> DeserializeList<T>(string json)
    {
        return JsonConvert.DeserializeObject<List<T>>(json);
    }
}

class Sample1
{
    public string Id1 { get; set; }
    public string Name1 { get; set; }
    public int Age1 { get; set; }
}


class Sample2
{
    public string Id2 { get; set; }
    public string Name2 { get; set; }
    public int Age2 { get; set; }
}

输出:

【讨论】:

  • @istudent,查看答案可能对你有帮助:)
【解决方案2】:

您可以使用try-catch

try
{
     var someresult = JsonConvert.DeserializeObject<Type1>(data.ToString());
     // data was Type1 indeed, deal with Type1
}
catch{} 
try
{
     var someresult = JsonConvert.DeserializeObject<Type2>(data.ToString());
     // data was Type2 indeed, deal with Type2
}
catch{} 

【讨论】:

  • 异常消息是“解析值时遇到意外字符:S. Path '', line 0, position 0。”
  • 那么你总是会在这些catches 之一中遇到异常,因为类型只会匹配一个。但如果你对两者都有例外,那么你传递的项目与其中任何一个都不匹配。
  • 我认为我正在通过 ajax 传递数组数组时遇到异常。一旦我成功创建 json 对象,我就会回来。谢谢阿什坎。
猜你喜欢
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多