2010-04-19 39 views
32

我無法將JSON字符串轉換爲asp.net中的.net對象。我從客戶端使用隱藏字段發送JSON字符串到服務器(通過隱藏字段保持JSON object.Tostring()和隱藏文件代碼讀取隱藏字段的值)在asp.net中將JSON轉換爲.Net對象時出錯

JSON字符串/對象:

[[{"OfferId":"1","OrderValue":"11","HostingTypeID":"3"}, 
{"OfferId":"1","OrderValue":"11","HostingTypeID":"3"}, 
{"OfferId":"1","OrderValue":"11","HostingTypeID":"3"}, 
{"OfferId":"1","OrderValue":"2","HostingTypeID":"3"}, 
{"OfferId":"1","OrderValue":"2","HostingTypeID":"3"}, 
{"OfferId":"1","OrderValue":"67","HostingTypeID":"3"}, 
{"OfferId":"1","OrderValue":"67","HostingTypeID":"3"}], 
[{"OfferId":"1","OrderValue":"99","HostingTypeID":"6"}], 
[{"OfferId":"1","OrderValue":"10","HostingTypeID":"8"}]] 

.NET對象代碼

public class JsonFeaturedOffer 
{ 
    public string OfferId { get; set; } 

    public string OrderValue { get; set; } 

    public string HostingTypeID { get; set; } 
} 

Converstion代碼隱藏文件

byte[] byteArray = Encoding.ASCII.GetBytes(HdnJsonData.Value); 
     MemoryStream stream = new MemoryStream(byteArray); 
     DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(JsonFeaturedOffer)); 
     object result= serializer.ReadObject(stream); 
     JsonFeaturedOffer jsonObj = result as JsonFeaturedOffer; 

雖然轉換我收到以下錯誤:

期待元素的命名空間「根」「」 ..遇到「無」名爲「」,命名空間'。

回答

31

而不是做這個手工我會建議使用內置的012 輕巧JavaScriptSerializer對於要序列化/反序列化的類,不需要屬性

它比DataContractJsonSerializer更靈活,更快速,因爲它不必關心所有wcf的東西。此外它有通用過載,使它非常簡單的使用,它也可以處理匿名類型

連載:

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 
var objectAsJsonString = serializer.Serialize(objectToSerialize); 

反序列化:

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 
JsonFeaturedOffer deserializedObject = serializer.Deserialize<JsonFeaturedOffer>(s_JsonBaseDate); 

爲了使其更容易,您可以創建擴展方法,這將使你JSON序列化/反序列化直接在物體/串。

+0

你錯了一件事:它比我在我的測試中看到的要慢x3-4倍 – 2016-08-04 21:56:17

+0

這是2010年的答案,我當然希望標準的json序列化程序有所改進:) – ntziolis 2017-01-25 16:56:59

+0

@ntziolis並非如此。即使微軟建議使用Newtonsoft。 JSON.Net的性能令人難以置信。 – krillgar 2017-06-12 17:08:59

2

如果這是JsonFeaturedOffers的數組的數組,應該不會是:

byte[] byteArray = Encoding.ASCII.GetBytes(HdnJsonData.Value); 
MemoryStream stream = new MemoryStream(byteArray); 
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(JsonFeaturedOffer[][])); 
object result= serializer.ReadObject(stream); 
JsonFeaturedOffer[][] jsonObj = result as JsonFeaturedOffer[][]; 
+0

謝謝你爲我工作.. – 2010-04-19 15:40:43

3

如果您希望類自動神奇序列化爲JSON/XML或對象序列化,你需要裝飾它與一些序列化的屬性:

[Serializable, XmlRoot("JsonFeaturedOffer"), DataContract(Name="JsonFeaturedOffer")] 
public class JsonFeaturedOffer 
{ 
    [XmlElement ("OfferId"), DataMember(Name="OfferId")] 
    public string OfferId {get; set;} 

...等等

+0

謝謝你幫我和問題得到解決 – 2010-04-19 15:40:59

+0

@Vinni - 好消息! – amelvin 2010-04-19 15:48:45

66

不幸的是,所提出的解決方案都不能解決問題的真正根源。此異常意味着您的解串器嘗試從流尾讀取。

解決方案是將流回捲到開頭,即。在反序列化之前設置stream.Position = 0;

+2

Xactly,謝謝mr.pszmyd .. – pvaju896 2011-08-23 06:15:46

+2

謝謝,你說得對。我將位置設置爲0,並且都可以。 – 2012-02-23 14:20:34

+2

您解決了我的問題。非常感謝。 – Billdr 2013-01-10 01:18:33