2011-11-20 19 views
12

この質問は何度も繰り返し尋ねられていますが、何らかの理由でこれを動作させることができません。DataContractJsonSerializerを使用して単純なJSON配列を逆シリアル化する

単一のメンバーを含むJSONオブジェクトを逆シリアル化する必要があります。文字列の配列:

{"results" : ["a", "b"]} 

これは私がにデシリアライズしようとしているクラスです。

public class Whatever { 
    [DataMember(Name = "results")] 
    public string[] Results { get; protected set; } 
} 

そして、これが逆シリアル化方法である:

private static T Deserialize<T>(string json) 
{ 
    var instance = Activator.CreateInstance<T>(); 
    using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json))) 
    { 
     var serializer = new DataContractJsonSerializer(instance.GetType()); 
     return (T)serializer.ReadObject(ms); 
    } 
} 

Deserialize<Whatever>("{\"results\" : [\"a\", \"b\"]}")のような呼び出しがあります初期化されたインスタンスWhateverを返しますが、Resultsの配列はnullのままです。

Whateverの構造に何か問題がありますか?ああ、これを掲示した後、私はWhateverDataContract属性の装飾を欠落していたことに気づい

+11

あなたは= Activator.CreateInstance () 'VARインスタンスを必要としません;' 'typeof演算(T)' –

答えて

12

[DataContract] 
public class Whatever { 
    [DataMember(Name = "results")] 
    public string[] Results { get; protected set; } 
} 

は、今では正常に動作します。

+6

感謝を使用しています。大文字と小文字を区別するデータメンバの名前をマッピングすることも重要です。あなたはそれをしましたが、誰かがDataContractとDataMemberを使用しようとしたときにこれを強調したいと思いますが、(私が初めて行ったように)Name属性を忘れてしまいました。 – cudahead

+1

あなたは素晴らしいです! –

8

私は知っている、投稿はかなり禁止されています。しかし: また、データクラスにバインドする情報のjsonarray文字列があれば、クラスオブジェクトのリストを直接返すこともできます。すなわち:データクラスSomeDataClass.csと

List<SomeDataClass> filesToMove = new List<SomeDataClass>(); 

public T deserializeJSON<T>(string json) 
{ 
    var instance = typeof(T); 
    var lst = new List<SomeDataClass>(); 

    using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json))) 
    { 
     var deserializer = new DataContractJsonSerializer(instance); 
     return (T)deserializer.ReadObject(ms); 
    } 
} 

someJsonArrayString = "[{\"ID\":7},{\"ID\":16}]"; 
filesToMove = deserializeJSON<List<SomeDataClass>>(someJsonArrayString); 
Console.WriteLine(filesToMove[1].ID); // returns 16 

[DataContract] 
class SomeDataClass 
{ 
    [DataMember] 
    public int ID { get; set; }   
} 
+0

Listとは何ですか、あなたの例はあなたが投稿したようには機能しません。 – Sebastian

関連する問題