2010-04-19 65 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