2012-01-27 16 views
18

.NET MVC3で配列をデシリアライズする際に問題が発生しました。ここでJavaScriptSerializer.Deserialize array

は、コードスニペットです:

using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
using (StreamReader reader = new StreamReader(response.GetResponseStream())) { 
    JavaScriptSerializer jsSerializer = new JavaScriptSerializer(); 
    string jsonData = reader.ReadToEnd(); 
    result = (BigCommerceOrderProducts)jsSerializer.Deserialize<BigCommerceOrderProducts>(jsonData); 
} 

ここjsonDataとしてJSONで返されたデータ列のサブセットです。余分なフィールドを削除しました。ここで

"[ 
{\"id\":33,\"order_id\":230025,...}, 
{\"id\":34,\"order_id\":230025,...} 
]" 

オブジェクトです:

[Serializable] 
public class BigCommerceOrderProducts { 
    public List<BigCommerceOrderProduct> Data { get; set; } 
} 

[Serializable] 
public class BigCommerceOrderProduct { 
    public int Id { get; set; } 
    public int Order_id { get; set; } 
    ... 
} 

が、私はこのエラーを取得しています:

"Type 'Pxo.Models.BigCommerce.BigCommerceOrderProducts' is not supported for deserialization of an array. 

任意のアイデア?

+0

あなたのJSON文字列は.NETオブジェクトにラップされていますか?ここで見て:http://stackoverflow.com/questions/402996/deserializing-json-objects-as-listtype-not-working-with-asmx-service – JoJa

答えて

46

json文字列を逆シリアル化してList<BigCommerceOrderProduct>と入力する必要があります。 BigCommerceOrderProductsクラス

var myobj = jsSerializer.Deserialize<List<BigCommerceOrderProduct>>(jsonData); 
+0

ありがとう、それは今意味があります。もう一度やり直してみましょう。 – Dean

+1

これは驚異的に機能しました!ありがとう。 – Dean

1

この小さなproggyのための必要はありません私のために正常に動作しません。応答ストリームで予期せぬものになる可能性があります。

JSON出力である:{ "データ":[{ "ID":33、 "ORDER_ID":230025}、{ "ID":34、 "ORDER_ID":230025}]}

JavaScriptSerializer jsSerializer = new JavaScriptSerializer(); 

    BigCommerceOrderProducts a = new BigCommerceOrderProducts(); 
    a.Data = new List<BigCommerceOrderProduct>(); 
    BigCommerceOrderProduct b = new BigCommerceOrderProduct(); 
    b.Id = 33; 
    b.Order_id = 230025; 

    a.Data.Add(b); 

    b = new BigCommerceOrderProduct(); 
    b.Id = 34; 
    b.Order_id = 230025; 

    a.Data.Add(b); 

    string x = jsSerializer.Serialize(a); 
    Console.WriteLine(x); 

    a = jsSerializer.Deserialize<BigCommerceOrderProducts>(x); 

    Console.WriteLine(a.Data[0].Order_id); 

    Console.ReadLine(); 
+0

Chris "、" "\" order_id \ ":230025、...}、\" id \ ":34、\" order_id \ ":230025、...}] "{" Id ":33、" Order_id ":230025}、{" Id ":34、" Order_id ":230025}}}'はオブジェクトです。配列を含む。 2つの異なること。 –

+0

はい、私はその違いを知っています。 OPが "Data":部分を削除したか、またはOPがList <>へ配列を逆シリアル化しようとしています。そのため、応答で返されたJSONが正しくないか、OPがBigCommerceOrderProduct []に逆シリアル化する必要があります。 –

+0

私の答えを見て、応答は正しいですし、リストにdeserializedすることができます。 (私のマシンで実行する前にコードを投稿することは決してない、または*未テスト*とマークする) –