Ошибка десериализации JSON: параметр не может быть нулевым

1

Не удалось найти ответ на другие вопросы, связанные с проблемой Json Serialization, поэтому, возможно, кто-то может мне помочь:

Я получаю объект JSON из REST api и пытаюсь десериализовать его на объект. Ниже представлен объект JSON, который я получаю:

{"id":"6wVcZ9ZF67ECUQ8xuIjFT2",
"userId":"83ca0ab5-3b7c-48fe-8019-000320081b00",
"authorizations":["employee","API","trainer","queueAdmin","supervisor","workflowAdmin","realtimeManager","forecastAnalyst","qualityEvaluator","contactCenterManager","teamLead","personnelAdmin","telephonyAdmin","qualityAdmin","businessAdmin","businessUser","accountAdmin","dialerAdmin","contentManagementUser","contentManagementAdmin","admin","api","scriptDesigner","agent","user"],
"primaryAuthorization":"employee",
"thirdPartyOrgName":"in",
"username":"somebody",
"selfUri":"https://blahblahblah.com/api/v1/auth/sessions/6wVcZ9ZF67ECUQ8xuIjFT2"}

И моя цель, я пытаюсь DeSerialize:

 [Serializable]
public class Session : BaseRequest, ISession
{
    public Session(string url) : base(url)
    {
    }

    #region Members

    [JsonProperty(PropertyName = "userId")]
    public string UserId { get; set; }

    [JsonProperty(PropertyName = "authorizations")]
    public object[] Authorizations { get; set; }

    [JsonProperty(PropertyName = "primaryAuthorization")]
    public string PrimaryAuthorization { get; set; }

    [JsonProperty(PropertyName = "thirdPartyOrgName")]
    public string ThirdPartyOrgName { get; set; }

    [JsonProperty(PropertyName = "username")]
    public string Username { get; set; }

    [JsonProperty(PropertyName = "id")]
    public string Id { get; set; }

    [JsonProperty(PropertyName = "selfUri")]
    public string SelfUri { get; set; }

    #endregion
}

Я просто делаю веб-запрос и получаю поток ответов с помощью средства чтения потока и возвращаю строку. Довольно стандартный.

Однако, когда я пытаюсь Deserialize в свой объект Session, он всегда вызывает ошибку: Значение не может быть Null

var serializer = new JsonSerializer();
response = MakePostRequest(true);
var obj = serializer.Deserialize<Session>(new JsonTextReader(new StringReader(response)));

Ответ - это строка JSON, которую я возвращаю из веб-запроса, и точно соответствует тому, что я указал выше.

Я сделал это раньше, но, как правило, я был тем, кто проектировал REST api. На этот раз не так, но я не могу для жизни понять, почему это не будет десериализовать? Я указал JSonProperty PropertyName, чтобы избежать проблем с надлежащим корпусом, возможно, это не работает? Любая помощь приветствуется!

UDPATE

Думаю, я нашел часть проблемы. Он пытается десериализовать мой базовый класс, который состоит из:

 public abstract class BaseRequest
{
    protected BaseRequest(string apiUrl)
    {
        ApiUrl = apiUrl;

        Request = (HttpWebRequest)WebRequest.Create(apiUrl);
    }

    public string ApiUrl { get; set; }

    public string JsonPayload { get; set; }

    public HttpWebRequest Request { get; private set; }
}

Есть ли какая-либо директива, которую я могу дать, чтобы предотвратить ее? Или мне нужно будет реорганизовать это?

  • 0
    Ваш код отлично работает для меня. Просто дайте нам полное сообщение об исключении / stacktrace. Вы уверены, что ответ не является нулевым? Вы можете получить это исключение, если передадите null в конструктор StringReader. Другой вариант - исключение из конструктора BaseRequest. Опубликуйте код тоже :)
Теги:
deserialization
serialization

3 ответа

0
Лучший ответ

Ниже кода работает (с помощью Json.Net):

var session = JsonConvert.DeserializeObject<Session>(json);

public class Session
{
    public string Id { get; set; }
    public string UserId { get; set; }
    public List<string> Authorizations { get; set; }
    public string PrimaryAuthorization { get; set; }
    public string ThirdPartyOrgName { get; set; }
    public string Username { get; set; }
    public string SelfUri { get; set; }
}

РЕДАКТИРОВАТЬ

Как я должен сказать, чтобы игнорировать базовый класс?

var session = (Session)System.Runtime.Serialization.FormatterServices.GetSafeUninitializedObject(typeof(Session));
JsonConvert.PopulateObject(DATA, session);

Но я не думаю, что это хороший способ сделать это. Изменение дизайна может быть лучшим решением.

  • 0
    Я думаю, что наконец вижу свою проблему. Как мне сказать, чтобы он игнорировал базовый класс?
  • 0
    @ Расшифровка Я понятия не имею, что такое BaseRequest . Если вы отправите это, я могу попытаться помочь.
Показать ещё 3 комментария
0

Ваш код работает отлично для меня, но у меня нет исходного кода BaseRequest, поэтому я создал класс с пустым конструктором.

ИМО исключение происходит именно оттуда. В конструкторе Session параметр url имеет значение null, поскольку ваш объект JSON не имеет свойства url. Может быть, в классе BaseRequest вы используете этот параметр url, и вы получите значение Не может быть ошибкой Null.

Вы можете изменить только имя параметра, если это проблема:

  public Session(string selfUri ) : base(selfUri)
  {
  }

Проверьте также, является ли переменная "response" равной нулю. StringReader может передать это исключение, если передать значение null в его конструктор.

  • 0
    Если selfUri - это URL-адрес, который OP хочет использовать в базовом классе, то это лучший ответ. (Я удалю мою в этом случае)
0

Я тестировал ваш код, и он работает нормально, только изменение, которое я сделал, это удаление конструктора, я полагаю, что сериализатор не может создать экземпляр объекта по какой-либо причине, вы можете удалить

public Session(string url) : base(url)
{
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню