Ошибка преобразования JSON в .Net-объект в asp.net

Я не могу преобразовать строку JSON в .net-объект в asp.net. Я отправляю строку JSON от клиента к серверу с помощью скрытого поля (сохраняя объект JSON.Tostring() в скрытом поле и считывая значение скрытого поля в коде за файлом)

Строка Json/Object:

 [[{"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 Object

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;

При преобразовании я получаю следующую ошибку:

Ожидание элемента 'root' из пространства имен ''.. Encountered 'None' с именем '', namespace ''.

Ответ 1

Вместо этого вручную я бы рекомендовал использовать встроенный легкий 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 непосредственно на объектах/строках.

Ответ 2

К сожалению, ни одно из предлагаемых решений не решает реальный источник проблемы. Это исключение означает, что ваш десериализатор пытается прочитать из конца потока.

Решение состоит в том, чтобы перемотать поток в начало, т.е. перед десериализацией установите stream.Position = 0;.

Ответ 3

Если вы хотите, чтобы класс автоматически изменял сериализацию в json/xml или deserialize в объекте, вам нужно украсить его некоторыми атрибутами сериализации:

[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[][];