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;

DataContractJsonSerializer引发异常预期状态';元素';.遇到';文本'

我遇到了同样的问题。

我从客户端(使用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());