【发布时间】:2012-03-07 16:29:45
【问题描述】:
我需要帮助来序列化一段 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;
【问题讨论】:
-
你能发布更多关于服务代码的上下文吗?我怀疑额外的编码层来自将您的字符串包装在 JSON 字符串中的服务层。您可能希望您的服务函数返回类型
List<MyClass>,而不是string,它可能会自动执行 JSON 序列化。取决于您使用的服务。 -
当被解码的数据不是有效的 JSON 时,你也会得到这个错误。例如:字符串
"1,2,3"在解码时会报错,因为"1,2,3"是一个有效的JSON值但不是一个有效的object;如果数据是“[1,2,3]”,它会起作用,因为这是一个数组对象,可以解码为一个数组。
标签: c# json serialization