C# 如何从Jason';在C中序列化对象#
我想将数据列表返回为Json格式 我正在尝试从SerializedObject获取数据的各种方法,但我无法对该对象进行反序列化,而且我还尝试从WebAPI获取数据到控制台应用程序。 这是我的Web API代码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 (
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响应) 确定问题:
公共列表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