DataContractJsonSerializer引发异常预期状态';元素';.遇到';文本'
本文关键字:遇到 文本 元素 状态 异常 DataContractJsonSerializer | 更新日期: 2023-09-27 18:26:59
我需要帮助来序列化一段json。
我从一个rest服务得到一个响应,该服务返回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);
这是MyClass:
[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只包含一个属性(Value)。这是一个简单的例子,只是针对答案的情况。如果您想要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对象,唯一要做的就是创建一个更复杂的类结构
我希望这会有所帮助。
当我对服务响应进行反序列化时,它会起作用,这让我怀疑你与MemoryStream的额外舞蹈在某个地方导致了空流。只需简化它并将响应流直接传递给序列化程序:
HttpWebResponse response = webRequest.GetResponse();
var serializer = new DataContractJsonSerializer(typeof(List<MyClass>));
var list = (List<MyClass>)serializer.ReadObject(response.GetResponseStream());