C# DataContractJsonSerializer引发异常,期望状态为#x27;元素';。。遇到';文本';名称为'';,名称空间'';

C# DataContractJsonSerializer引发异常,期望状态为#x27;元素';。。遇到';文本';名称为'';,名称空间'';,c#,json,serialization,C#,Json,Serialization,我需要帮助序列化一段json 我从rest服务得到响应,该服务返回json。之后,我想将请求映射到一个类。我正在使用DataContractJsonSerializer,但我无法让它工作 序列化数据时,将引发以下异常: "Expecting state 'Element'.. Encountered 'Text' with name '', namespace ''. " 代码如下: HttpWebResponse response = (HttpWebResponse)webRequest

我需要帮助序列化一段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);
服务的响应是:

"[{\"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;
List myClass=validationManager.GetXmlAsAListOfEducationInformationObject();
JavaScriptSerializerserializer=新的JavaScriptSerializer();
字符串jsonData=serializer.Serialize(myClass);
返回jsonData;

当我对服务响应进行反序列化时,它会起作用,这让我怀疑您与MemoryStream的额外共舞在某处导致了空流。只需简化它并将响应流直接传递给序列化程序:

HttpWebResponse response = webRequest.GetResponse();
var serializer = new DataContractJsonSerializer(typeof(List<MyClass>));
var list = (List<MyClass>)serializer.ReadObject(response.GetResponseStream());
HttpWebResponse-response=webRequest.GetResponse();
var serializer=newdatacontractjsonserializer(typeof(List));
var list=(list)serializer.ReadObject(response.GetResponseStream());
我也有同样的问题

我正在将一个JSON对象从客户端(使用jQuery的浏览器)发送到我的服务器应用程序(使用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结构):

这两个类只包含一个属性。这是因为在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();
Abstract=Activator.CreateInstance();
MemoryStream MemoryStream=新的MemoryStream(Encoding.Unicode.GetBytes(“上述JSON文本”);
DataContractJsonSerializer=新的DataContractJsonSerializer(theAbstract.GetType());
抽象=(抽象)序列化程序.ReadObject(memoryStream);
memoryStream.Dispose();
对于更复杂的JSON对象,唯一要做的就是创建更复杂的类结构。

我希望这会有所帮助。

恐怕这会产生与我在原始代码中遇到的相同的异常。您能为服务代码发布更多的上下文吗?我怀疑额外的编码层来自服务层,它将字符串包装成JSON字符串。您可能希望服务函数返回类型
List
,而不是
string
,并且它可能会自动执行JSON序列化。取决于您在服务中使用的内容。谢谢George-此人应该真正为您提供正确的答案状态。我必须说我面临这个问题,但我的问题是我的序列化根本不是json。。。在发送带有嵌套对象的正确JSON后,我没有接触任何类类型,一切正常。也许仅仅向所有涉及的类型添加无参数构造函数就不需要执行上述操作(标记类抽象等)?这是我的设想。
public class Abstract 
{
    public int Conference_id { get; set; }
    public SubmissionTypeClass SubmissionType { get; set; }
    public List<TextPublishTypeClass> TextPublishType{ get; set; }
}  
public class SubmissionTypeClass 
{
    public int Value { get; set; }
}

public class TextPublishTypeClass 
{
    public int Value { get; set; }
}
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();