【问题标题】:Error converting JSON to .Net object in asp.net在 asp.net 中将 JSON 转换为 .Net 对象时出错
【发布时间】:2010-04-19 15:25:58
【问题描述】:

我无法在 asp.net 中将 JSON 字符串转换为 .net 对象。我正在使用隐藏字段将 JSON 字符串从客户端发送到服务器(通过将 JSON object.Tostring() 保留在隐藏字段中并读取文件后面代码中的隐藏字段值)

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

代码隐藏文件中的转换代码

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;

转换时出现以下错误:

来自命名空间“”的预期元素“根”。遇到名称为“无”,命名空间“”。

【问题讨论】:

    标签: c# asp.net javascript json


    【解决方案1】:

    很遗憾,所提出的解决方案都没有解决问题的真正根源。此异常意味着您的反序列化器尝试从流的末尾读取

    解决方案是将流倒回到开头,即。在反序列化之前设置stream.Position = 0;

    另外,正如 cmets 所提到的,如果您使用 StreamWriter,则需要在使用流之前刷新它。

    【讨论】:

    • 对我来说也是同样的解决方案。谢谢。
    • 有一个类似的问题,但在我的情况下,我用来填充流的字符串编写器在让反序列化器读取之前没有刷新到流中
    • 或者如果你的内存流长度为0,你需要在设置写入器的位置之前调用Flush方法
    【解决方案2】:

    我建议使用内置轻量级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 序列化/反序列化。

    【讨论】:

    • 你错了一件事:它比我在测试中看到的要慢 3-4 倍
    • 这是 2010 年的答案,我当然希望标准 json 序列化程序有所改进 :)
    • @ntziolis 不是真的。甚至微软也推荐使用 Newtonsoft。 JSON.Net 的性能令人难以置信。
    【解决方案3】:

    如果您希望类自动神奇地序列化为 json/xml 或在对象中反序列化,您需要使用一些可序列化的属性来装饰它:

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

    ...等等

    【讨论】:

      【解决方案4】:

      如果这是一个 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[][];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-07
        • 1970-01-01
        • 2020-06-30
        • 2022-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多