Ошибка преобразования JSON в объект .Net в asp.net - PullRequest
36 голосов
/ 19 апреля 2010

Мне не удалось преобразовать строку JSON в объект .net в asp.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 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' из пространства имен '' .. Обнаружен 'None' с именем '', пространство имен ''.

Ответы [ 4 ]

75 голосов
/ 01 июля 2011

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

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

Кроме того, как отмечается в комментариях, если вы использовали StreamWriter, вам необходимо очистить его перед использованием потока.

34 голосов
/ 19 апреля 2010

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

Чтобы сделать его еще проще, вы можете создать методы Extension, которые дадут вам сериализацию / десериализацию json непосредственно для объектов / строк.

3 голосов
/ 19 апреля 2010

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

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

... и т. Д.

2 голосов
/ 19 апреля 2010

Если это массив массивов 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[][];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...