如何在C#中从Jason的serializedObject获取数据

时间:2019-12-17 15:22:24

标签: c# asp.net json asp.net-web-api console-application

我想以Json格式返回数据列表。

我正在尝试各种方法来从SerializeObject获取数据,但是我无法反序列化对象,而且我尝试从Web API向控制台应用程序获取数据。 这是我的Web API代码

public string Get()
    {
        List<Student> studentList = new List<Student>();
        Random rand = new Random();

        for (int i = 0; i < 100; i++)
        {
            int r = rand.Next(1, 1000);
            studentList.Add(new Student
            { 
                ID = i, 
                Name = "Dhruv"+i, 
                Rand = r 
            }); 
        }
        string _JsonData = JsonConvert.SerializeObject(studentList);
        return _JsonData;
    }

这是我的学生班

public class Student
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int Rand { get; set; }
}

现在,我尝试将这些数据导入控制台应用程序。 这是我的控制台应用程序代码。

public static void GetJsonData()
    {
        string jsonData = new WebClient().DownloadString("https://localhost:44374/api/GetData");
        List<StudentData> item = JsonConvert.DeserializeObject<List<StudentData>>(jsonData);

        foreach (var i in item)
        {
            Console.WriteLine("ID: " + i.ID);
            Console.WriteLine("Name: " + i.Name.ToUpper());
            Console.WriteLine("Rand No: "+i.Rand);
        }
    }

这是我的StudentData类

class StudentData
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int Rand { get; set; }
}

我遇到的错误是:

  

ArgumentException:无法将System.String强制转换或转换为   System.Collections.Generic.List`1 [Data_Collector.StudentData]。

这是我从Web API获取的Json。

"[{\"ID\":0,\"Name\":\"Dhruv0\",\"Rand\":52},{\"ID\":1,\"Name\":\"Dhruv1\",\"Rand\":44},{\"ID\":2,\"Name\":\"Dhruv2\",\"Rand\":118},{\"ID\":3,\"Name\":\"Dhruv3\",\"Rand\":668},{\"ID\":4,\"Name\":\"Dhruv4\",\"Rand\":142},{\"ID\":5,\"Name\":\"Dhruv5\",\"Rand\":864},{\"ID\":6,\"Name\":\"Dhruv6\",\"Rand\":150},{\"ID\":7,\"Name\":\"Dhruv7\",\"Rand\":412},{\"ID\":8,\"Name\":\"Dhruv8\",\"Rand\":515},{\"ID\":9,\"Name\":\"Dhruv9\",\"Rand\":105}]"

4 个答案:

答案 0 :(得分:0)

正如我对您的帖子的评论中所提到的,您应该使用与反序列化的类相同的类(即使相同,为清楚起见)

对我来说,您的代码似乎正确。我怀疑您尝试反序列化的json字符串格式错误: 使用您的代码:

window.dataLayer = window.dataLayer || [];  
// Measure the removal of a product from a shopping cart.
window.dataLayer.push({
  'event': 'addToCart',
  'ecommerce': {
    'currencyCode': 'BGN',
    'add': {                                // 'add' actionFieldObject measures.
      'products': [
        {
           'name': product.name,
           'price': product.finalPrice
        }
      ]
    }
  }
});

在我这方面工作正常。确保您的jsonData的格式为:

string jsonData = JsonConvert.SerializeObject(studentList);
List<StudentData> item = JsonConvert.DeserializeObject<List<StudentData>>(jsonData);

答案 1 :(得分:0)

看着错误,它看起来像是双重序列化的问题。首先,您的方法是将集合序列化为字符串,框架正在处理默认序列化(考虑这是rest响应)。

确定问题:

  1. 验证WebClient的响应类型为“ application / json”
  2. 在JSON响应数据的情况下,响应内容字符串不应包含转义字符。

解决方案:

  1. 只需修改您的方法即可返回集合,而客户端无需更改。
public List<Student> Get()
    {
        List<Student> studentList = new List<Student>();
        Random rand = new Random();

        for (int i = 0; i < 100; i++)
        {
            int r = rand.Next(1, 1000);
            studentList.Add(new Student
            { 
                ID = i, 
                Name = "Dhruv"+i, 
                Rand = r 
            }); 
        }
        return studentList;
    }

OR

  1. 将响应内容反序列化为字符串,然后再反序列为所需的集合。

此外,如果要从WebAPI返回数据,最好使用Request.CreateResponse(StatusCode,Objectdata);

答案 2 :(得分:0)

以下是我复制的三种方法


        public class Student
        {
            public int ID { get; set; }
            public string Name { get; set; }
            public int Rand { get; set; }
        }

        public class StudentData
        {
            public int ID { get; set; }
            public string Name { get; set; }
            public int Rand { get; set; }
        }
        public static string Get()
        {
            List<Student> studentList = new List<Student>();
            Random rand = new Random();

            for (int i = 0; i < 100; i++)
            {
                int r = rand.Next(1, 1000);
                studentList.Add(new Student
                {
                    ID = i,
                    Name = "Dhruv" + i,
                    Rand = r
                });
            }
            string _JsonData = JsonConvert.SerializeObject(studentList);
            return _JsonData;
        }

在我的主文件中,我运行了以下代码,该代码完全可以完成您的工作。无需调用必须获取json的API,而是调用方法Get()来获取json。 Get为您提供数据的序列化版本,然后反序列化为另一个类。

    string jsonData = Get();
    //string jsonData = "[{\"ID\":0,\"Name\":\"Dhruv0\",\"Rand\":52},{\"ID\":1,\"Name\":\"Dhruv1\",\"Rand\":44},{\"ID\":2,\"Name\":\"Dhruv2\",\"Rand\":118},{\"ID\":3,\"Name\":\"Dhruv3\",\"Rand\":668},{\"ID\":4,\"Name\":\"Dhruv4\",\"Rand\":142},{\"ID\":5,\"Name\":\"Dhruv5\",\"Rand\":864},{\"ID\":6,\"Name\":\"Dhruv6\",\"Rand\":150},{\"ID\":7,\"Name\":\"Dhruv7\",\"Rand\":412},{\"ID\":8,\"Name\":\"Dhruv8\",\"Rand\":515},{\"ID\":9,\"Name\":\"Dhruv9\",\"Rand\":105}]";
    Console.WriteLine(jsonData);

    List<StudentData> item = JsonConvert.DeserializeObject<List<StudentData>>(jsonData);
    foreach(var i in item)
    {
        Console.WriteLine("ID: " + i.ID);
        Console.WriteLine("Name: " + i.Name.ToUpper());
        Console.WriteLine("Rand No: " + i.Rand);
    }

Get()方法中的jsonData和该字符串都可以正常工作,并为您提供所需的输出。

ID: 0
Name: DHRUV0
Rand No: 52
ID: 1
Name: DHRUV1
Rand No: 44
... // hiding 2 - 7 
ID: 8
Name: DHRUV8
Rand No: 515
ID: 9
Name: DHRUV9
Rand No: 105

代码没有任何问题。.唯一不起作用的是假设您的https://localhost调用可以检索json字符串。修复API后,您将可以使用这些方法。

答案 3 :(得分:-1)

//获取包含服务器返回内容的流。 流dataStream = response.GetResponseStream();

//使用StreamReader打开流以方便访问。  StreamReader reader = new StreamReader(dataStream);

//读取内容。这是JSON。                 字符串responseFromServer = reader.ReadToEnd();

var data =(JObject)JsonConvert.DeserializeObject(responseFromServer);                 var products = data [“ Students”]。Children();

,然后是for循环。

也许您应该尝试将json对象声明为var而不是字符串。