C# 如何从Jason';在C中序列化对象#

C# 如何从Jason';在C中序列化对象#,c#,asp.net,json,asp.net-web-api,console-application,C#,Asp.net,Json,Asp.net Web Api,Console Application,我想将数据列表返回为Json格式 我正在尝试从SerializedObject获取数据的各种方法,但我无法对该对象进行反序列化,而且我还尝试从WebAPI获取数据到控制台应用程序。 这是我的Web API代码 public string Get() { List<Student> studentList = new List<Student>(); Random rand = new Random(); for (

我想将数据列表返回为Json格式

我正在尝试从SerializedObject获取数据的各种方法,但我无法对该对象进行反序列化,而且我还尝试从WebAPI获取数据到控制台应用程序。 这是我的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 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);
        }
    }
我得到的错误是:

ArgumentException:无法从System.String转换或转换为 System.Collections.Generic.List`1[Data\u 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}]"

正如我在你文章的评论中提到的,你应该使用与反序列化类相同的类(即使是相同的-为了清晰起见)

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

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

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

//使用StreamReader打开流以便于访问。 StreamReader=新的StreamReader(数据流)

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

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

然后是你的for循环


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

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

确定问题:

  • 验证WebClient的响应类型是否为“application/json”
  • 响应内容字符串包含转义字符,如果是JSON响应数据,则不应包含转义字符
  • 解决方案:

  • 只需修改您的方法以返回集合,而无需更改客户端
  • 公共列表Get()
    {
    List studentList=新列表();
    Random rand=新的Random();
    对于(int i=0;i<100;i++)
    {
    int r=rand.Next(11000);
    学生列表。添加(新学生)
    { 
    ID=i,
    Name=“Dhruv”+i,
    兰德=r
    }); 
    }
    返回学生名单;
    }
    

  • 首先将响应内容反序列化为字符串,然后再反序列化为所需的集合

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

    以下是我复制的三种方法

    
            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,你就可以使用这些方法了。

    你在控制台应用程序中实际收到了哪些数据,出现了哪些错误?发生了什么?你能成功下载json数据吗?你试过调试你的代码吗?
    jsonData
    的价值是什么?是的,数据已成功下载。没有什么可以说的,因为您已经正确编写了流程。在反序列化之前,请使用调试器查看json的值。反序列化不依赖于用于序列化字符串的类。只要同意变量名,就可以使用任何类。但在他的例子中,学生和学生的数据是“相同的”。尽量保持整洁。最好使用同一个类来序列化和反序列化。在我的例子中,我确实喜欢他:我序列化了列表和反序列化了列表,这很有效-这就是为什么我怀疑他的json字符串的格式错误作者使用的是类型安全数据模型,我知道这种反序列化jeson对象的方法,但我不想返回列表,但我想返回jsonSo如果您知道这个问题(即双重序列化),那么这里的问题是什么?是否要禁用框架本身的序列化?
    string jsonData = JsonConvert.SerializeObject(studentList);
    List<StudentData> item = JsonConvert.DeserializeObject<List<StudentData>>(jsonData);
    
    [
      {"ID":0,"Name":"Dhruv0","Rand":292},
      {"ID":1,"Name":"Dhruv1","Rand":813},
      {"ID":2,"Name":"Dhruv2","Rand":236},
      ... etc ...
    ]
    
    
    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;
        }
    
    
            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;
            }
    
        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);
        }
    
    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