Десериализация HttpWebResponse из JSON API в c # - PullRequest
0 голосов
/ 25 мая 2018

Я знаю, что таких тем существует много здесь, на stackoverflow.Но у меня немного другая проблема:

Я создал класс DataContract, как показано ниже:

    [DataContract]
  public class GLSParcelClass {
    internal string Location;
    internal string ConsignmentId;
    internal string Labels;
    internal List<Parcels> ParcelList;
    internal List<Returns> ReturnList;
  }

  [DataContract]
  public class Parcels {
    internal string Location;
    internal string TrackId;
    internal string ParcelNumber;
  }

  [DataContract]
  public class Returns {
    internal string Location;
    internal string TrackId;
    internal string ParcelNumber;
  }

Затем я написал следующую функцию:

      WebRequest httpWebRequest = WebRequest.Create(this.GLSUri);
  string json = "{" +
      "\"shipperId\":\"2764200001 276a165X14\"," +
      "\"references\":[\"47110815\"]," +
      "\"addresses\":{" +
        "\"delivery\":{" +
          "\"name1\":\"Max Meyer\"," +
          "\"name2\":\"Meyer Ltd.\"," +
          "\"street1\":\"Meyer Str. 227\"," +
          "\"street2\":\"2. Floor\"," +
          "\"country\":\"DE\"," +
          "\"zipCode\":\"92753\"," +
          "\"city\":\"Passau\"," +
          "\"email\":\"maxmeyer@gmail.com\"}}," +
      "\"parcels\":[" +
        "{" +
          "\"weight\":2.5," +
          "\"references\":[" +
            "\"47110815\"]" +
        "}" +
      "]" +
    "}";

  httpWebRequest.ContentType = "application/json";

  Type type = httpWebRequest.Headers.GetType();
  System.Reflection.BindingFlags flags = System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic;
  System.Reflection.MethodInfo m = type.GetMethod("AddWithoutValidate", flags);
  m.Invoke(httpWebRequest.Headers, new string[] { "Accept", "application/json" });
  m.Invoke(httpWebRequest.Headers, new string[] { "Accept-Language", "de" });
  m.Invoke(httpWebRequest.Headers, new string[] { "Accept-Encoding", "gzip,deflate" });

  httpWebRequest.Method = "POST";

  string lsEncodedCred = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("utf-8").GetBytes("shipmentsapi" + ":" + "shipmentsapi"));
  httpWebRequest.Headers.Add("Authorization", "Basic " + lsEncodedCred);
  httpWebRequest.PreAuthenticate = true;

  StreamWriter streamWriter = null;
  using (streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) {
    streamWriter.Write(json);
    streamWriter.Flush();
    streamWriter.Close();
  }

  HttpWebResponse httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();

  using (StreamReader loStream = new StreamReader(httpResponse.GetResponseStream())) {
    GLSParcelClass deserializedParcels = new GLSParcelClass();
    string lsJSON = loStream.ReadToEnd();
    MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(lsJSON));
    DataContractJsonSerializer ser = new DataContractJsonSerializer(deserializedParcels.GetType());
    deserializedParcels = ser.ReadObject(ms) as GLSParcelClass;
    ms.Close();
  }

Iполучил ответ «Создан» с кодом состояния 201 из JSON API в заголовке ответа.Все идет нормально.Но когда я получаю ResponseStream, я получаю сообщение об ошибке "System.Runtime.Serialization.SerializationException - Ошибка при десериализации объекта. Неожиданный символ". "." .

Альтернатива, которую я протестировалэто с клиентом Mozilla REST.И я получу правильный заголовок с правильным потоком ответов.

Поток ответов включал также PDF-документ в кодировке строки base64.

Я действительно не знаю, что не так, и я надеюсь, что вы можетепомогите мне.

Заранее большое спасибо.

Мило

1 Ответ

0 голосов
/ 25 мая 2018

Я просто смогу опубликовать очень небольшую часть ответа JSON, как на скриншоте:

Часть ответа JSON

Если я открываю JSONбыстрый просмотр в окне мониторинга, я просто получаю сообщение "строка не отформатирована в JSON".

Milo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...