gpt4 book ai didi

c# - DataContractJsonSerializer 抛出异常预期状态 'Element' .. 遇到 'Text' 名称 '',命名空间 ''

转载 作者:太空狗 更新时间:2023-10-29 17:49:47 24 4
gpt4 key购买 nike

我需要帮助来序列化一段 json。

我收到来自休息服务的响应,该服务正在返回 json。之后我想将请求映射到一个类。我正在使用 DataContractJsonSerializer,但我无法让它工作。

数据序列化时抛出以下异常:

"Expecting state 'Element'.. Encountered 'Text'  with name '', namespace ''. "

代码如下:

HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();

Stream responseStreamm = response.GetResponseStream();

StreamReader reader = new StreamReader(responseStreamm);

string streamAsString = reader.ReadToEnd();

MemoryStream memoryStream = new MemoryStream(Encoding.Unicode.GetBytes(streamAsString)) {Position = 0};

DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(List<MyClass>));

List<MyClass> myClass = (List<MyClass>)serializer.ReadObject(memoryStream);

这是我的类:

[DataContract]
public class MyClass
{
[DataMember]
public string RawData { get; set; }

[DataMember]
public string StudentIdentity { get; set; }

[DataMember]
public string FirstName { get; set; }

[DataMember]
public string LastName { get; set; }

[DataMember]
public string SchoolName { get; set; }

[DataMember]
public string SchoolCode { get; set; }

[DataMember]
public string TypeOfEducation { get; set; }

[DataMember]
public string EducationCode { get; set; }

[DataMember]
public string NationalProgram { get; set; }

[DataMember]
public string Objective { get; set; }

[DataMember]
public string IssuingDate { get; set; }

[DataMember]
public string GradeType { get; set; }

[DataMember]
public string ProgramRange { get; set; }

[DataMember]
public string HourTotal { get; set; }

[DataMember]
public string BasicEligibility { get; set; }

[DataMember]
public string OccupationCompetence { get; set; }

[DataMember]
public string CourseOfStudyFromSchool { get; set; }

[DataMember]
public string Software { get; set; }

[DataMember]
public string SoftwareProvider { get; set; }

[DataMember]
public string ProgramType { get; set; }

[DataMember]
public string Note { get; set; }
}

服务的响应是:

"[{\"RawData\":\"\",\"StudentIdentity\":\"450101\",\"FirstName\":\"Kalle\",\"LastName\":\"Karlsson\",\"SchoolName\":\"\",\"SchoolCode\":\"SKL123\",\"TypeOfEducation\":\"\",\"EducationCode\":\"Code\",\"NationalProgram\":\"\",\"Objective\":\"Obj\",\"IssuingDate\":\"2012-01-28\",\"GradeType\":\"GradeType\",\"ProgramRange\":\"1\",\"HourTotal\":\"2000\",\"BasicEligibility\":\"BE\",\"OccupationCompetence\":\"OC\",\"CourseOfStudyFromSchool\":\"Y\",\"Software\":\"HAL213\",\"SoftwareProvider\":\"SchoolSoft\",\"ProgramType\":\"C\",\"Note\":\"Notering\",\"CourseInformation\":[{\"CourseCode\":\"ABC555\",\"Grade\":\"VG\",\"GradeDate\":\"2012-01-28\",\"Points\":\"50\",\"Comment1\":\"Kommentar1\",\"Comment2\":\"\",\"Comment3\":\"\",\"AddtionalInformation\":\"Info\",\"Exceptions\":null},{\"CourseCode\":\"DFG333\",\"Grade\":\"G\",\"GradeDate\":\"2012-01-28\",\"Points\":\"60\",\"Comment1\":\"\",\"Comment2\":\"\",\"Comment3\":\"\",\"AddtionalInformation\":\"\",\"Exceptions\":null}],\"Exceptions\":[]}]"

非常感谢您的帮助!

编辑:

我正在补充服务代码:

List<MyClass> myClass = validationManager.GetXmlAsAListOfEducationInformationObject();

JavaScriptSerializerserializer = new JavaScriptSerializer();

string jsonData = serializer.Serialize(myClass);

return jsonData;

最佳答案

我遇到了同样的问题。

我从客户端(使用 jQuery 的浏览器)向我的服务器应用程序(使用 C# 的 IIS-ASP.NET)发送一个 JSON 对象。

JSON 包含内部 JSON 对象,因此存在问题。

下面我列出了 JSON 对象(示例情况的最小版本)、必须构造的 C# 类以及将 JSON 反序列化为 C# 数据类的代码。

JSON 对象:

"{"Conference_id":"9","SubmissionType":{"Value":"1"},"TextPublishType":[{"Value":"12"},{"Value":"9"}],"Title":"aTitle"}"  

注意:SubmissionType 属性包含一个内部 JSON 作为其值,而 TextPublishType 属性包含一个 JSON 对象数组作为其值。

必须构建的C#类(取决于JSON结构):

public class Abstract 
{
public int Conference_id { get; set; }
public SubmissionTypeClass SubmissionType { get; set; }
public List<TextPublishTypeClass> TextPublishType{ get; set; }
}

SubmissionType 定义为不同的类,因为它包含一个内部 JSON 对象。
TextPublishType 定义为不同类的列表,因为它包含一个内部数组 JSON 对象。

public class SubmissionTypeClass 
{
public int Value { get; set; }
}

public class TextPublishTypeClass
{
public int Value { get; set; }
}

这两个类只包含一个属性。这是因为在 JSON 对象上,内部 JSON 仅包含一个属性(值)。这是一个简单的示例,仅适用于答案案例。如果您想要 JSON 对象的更多属性,则必须在类定义中使用相同的键名定义它们。

反序列化代码:

Abstract theAbstract = Activator.CreateInstance<Abstract>();
MemoryStream memoryStream = new MemoryStream(Encoding.Unicode.GetBytes("the above JSON text"));
DataContractJsonSerializer serializer = new DataContractJsonSerializer(theAbstract.GetType());
theAbstract = (Abstract)serializer.ReadObject(memoryStream);
memoryStream.Dispose();

对于更复杂的 JSON 对象,唯一要做的就是创建更复杂的类结构。
希望对您有所帮助。

关于c# - DataContractJsonSerializer 抛出异常预期状态 'Element' .. 遇到 'Text' 名称 '',命名空间 '',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9605397/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com