Ошибка преобразования 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[][];