在asp.net中将JSON转换为.Net对象时出错

Vin*_*lla 36 javascript c# asp.net json

我无法在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"}]]
Run Code Online (Sandbox Code Playgroud)

.Net对象

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

    public string OrderValue { get; set; }

    public string HostingTypeID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

代码隐藏文件中的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;
Run Code Online (Sandbox Code Playgroud)

转换时我遇到以下错误:

期望来自命名空间''的元素'root'.遇到'无',名称为'',名称空间''.

Pio*_*myd 77

不幸的是,所提出的解决方案都没有解决问题的真正根源.此异常意味着您的反序列化程序尝试从流的末尾读取.

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

此外,正如评论所提到的,如果您使用StreamWriter,则需要在使用流之前将其刷新.

  • 这是实际问题 - 并解决了问题. (6认同)
  • 谢谢,你说得对.我将位置设置为0并且一切正常 (2认同)

ntz*_*lis 34

我不建议手动执行此操作,而是建议使用内置的轻量级JavaScriptSerializer.要序列化/反序列化的类不需要任何属性.

它也比DataContractJsonSerializer 更灵活,更快,因为它不需要关心所有wcf的东西.此外,它具有通用重载,使其使用非常简单,它也可以处理匿名类型.

连载:

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
var objectAsJsonString = serializer.Serialize(objectToSerialize);
Run Code Online (Sandbox Code Playgroud)

反序列化:

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
JsonFeaturedOffer deserializedObject = serializer.Deserialize<JsonFeaturedOffer>(s_JsonBaseDate);
Run Code Online (Sandbox Code Playgroud)

为了使它更容易,您可以创建Extension方法,直接在对象/字符串上提供json序列化/反序列化.