2012-03-07 22 views
6

jsonの一部をシリアル化するのに助けが必要です。DataContractJsonSerializerが例外をスローします。 'Element'の状態が予想されます。名前 ''、名前空間 ''を持つ 'Text'が発生しました

私は休憩サービスから応答を受け取り、サービスは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\":[]}]" 

大変助かりました!

編集:

私はサービスコードを補完しています:私はそれをデシリアライズするときに、サービスの応答がMemoryStreamを持つあなたの余分な踊りが原因になっている疑いがあるために私をリードしており、動作することを

List<MyClass> myClass = validationManager.GetXmlAsAListOfEducationInformationObject(); 

JavaScriptSerializerserializer = new JavaScriptSerializer(); 

string jsonData = serializer.Serialize(myClass); 

return jsonData; 
+0

サービスコードの周辺コンテキストを掲載することはできますか? JSON文字列に文字列をラップするサービス層からのエンコーディングが余計にあると思われます。サービス関数が 'string 012'ではなく' List 'の型を返すようにしたいのであれば、JSONを自動的にシリアライズするかもしれません。あなたがサービスのために使用しているものによって異なります。 –

答えて

6

私は同じ問題がありました。

私はJSONオブジェクトをクライアント(browser-using jQuery)からサーバーアプリケーション(IIS-ASP.NET for c#)に送信していました。

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; } 
} 

それが内側JSONオブジェクトを含む原因異なるクラスとして定義SubmissionType。
異なるクラスのリストとして定義されたTextPublishTypeには、内部配列のJSONオブジェクトが含まれているためです。

public class SubmissionTypeClass 
{ 
    public int Value { get; set; } 
} 

public class TextPublishTypeClass 
{ 
    public int Value { get; set; } 
} 

この2つのクラスには、1つのプロパティのみが含まれます。これは、JSONオブジェクトの内部JSONには1つのプロパティ(値)しか含まれていないためです。これは単に答えの場合の簡単な例です。 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の場合は、実行する唯一のものは、より複雑なクラス構造を作成することですオブジェクト。
私はそれが助けてくれることを願っています。

+0

ジョージさんにありがとうございました - 本当にあなたは正しい答えのステータスを与えるべきです。 –

+0

はい、答えとしてマークしてください。 – DelftRed

0

どこかでヌルストリーム。単純化し、シリアライザに直接応答ストリームを渡します。

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

元のコードで経験したのと同じ例外が発生するのではないかと恐れています。 – FatAlbert

関連する問題