DataContractJsonSerializer抛出异常期望状态'Element'。遇到名为'','namespace''的'Text'

时间:2012-03-07 16:29:46

标签: c# json serialization

我需要帮助来序列化一块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);

这是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;

2 个答案:

答案 0 :(得分:9)

我遇到了同样的问题。

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

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对象,唯一要做的就是创建一个更复杂的类结构 我希望它会有所帮助。

答案 1 :(得分:0)

当我反序列化它时服务响应有效,这导致我怀疑你与MemoryStream的额外跳舞导致某个地方出现空流。只需简化它并将响应流直接传递给序列化器:

HttpWebResponse response = webRequest.GetResponse();
var serializer = new DataContractJsonSerializer(typeof(List<MyClass>));
var list = (List<MyClass>)serializer.ReadObject(response.GetResponseStream());