Как я могу десериализовать и отобразить это правильно? - PullRequest
0 голосов
/ 28 января 2020

Я создаю плагин для Dynamics CRM, который использует API, и это моя проблема. Когда я получаю эту строку Json, я могу легко выполнить сопоставление. И я могу назвать это правильно.

{
  "userId": 1,
  "id": 2,
  "title": "qui est esse",
  "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
}

Мой код:

public string callRestAPI()
        {
            var request = (HttpWebRequest)WebRequest.Create("https://jsonplaceholder.typicode.com/posts/2");
            request.Method = "GET";
            request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
            request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
            var response =(HttpWebResponse)request.GetResponse();
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            string content = string.Empty;
            using (var stream = response.GetResponseStream())
            {
                using (var sr = new StreamReader(stream))
                {
                    return content = sr.ReadToEnd();
                }
            }
            throw new Exception($"api data is {content}");
        }

.. Отображение

public class RootObject
        {
            public int userId { get; set; }
            public int id { get; set; }
            public string title { get; set; }
            public string body { get; set; }
        }

.. А теперь пример того, как я звоню это

string Consume = callRestAPI();
 var Accs = JsonConvert.DeserializeObject<RootObject>(Consume);
                        try
                        {
                            Entity createcontact = new Entity("contact");
                            createcontact["firstname"] = "Joe";
                            createcontact["lastname"] = Accs.title;
                            createcontact["emailaddress1"] = "Joe.doe@gmail.com";

Но когда я получаю этот тип строки, я запутываюсь в этом и, кажется, не могу правильно ее вызвать. Мой код работает, когда мне нужно получить данные от API, который возвращает первую строку, но когда я переключаюсь на второй API, который выдает приведенную ниже строку, ничего не работает, и я просто растерялся.

{
"data": {
    "id": 2,
    "email": "janet.weaver@reqres.in",
    "first_name": "Janet",
    "last_name": "Weaver",
    "avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/josephstein/128.jpg"
}
}

1 Ответ

2 голосов
/ 28 января 2020

Ваш первый json фрагмент:

{
  "userId": 1,
  "id": 2,
  "title": "qui est esse",
  "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
}

... отображается правильно на RootObject class.

Однако, ваш второй json представляет иерархию :

{
   "data": {
       "id": 2,
       "email": "janet.weaver@reqres.in",
       "first_name": "Janet",
       "last_name": "Weaver",
       "avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/josephstein/128.jpg"
   }
}

... есть объект root, затем объект data, поэтому он не может быть сопоставлен с RootObject (поэтому семантически он не должен вызываться "Root Object" больше).

Итак, у вас есть 2 варианта:

  1. Просто добавьте класс, который представляет эту иерархию:

    public class Response
    {
        public RootObject data { get; set; }
    }
    

    ... и затем:

    JsonConvert.DeserializeObject<Response>(json);
    
  2. Или выберите только вложенный объект json:

    string dataJson = JObject.Parse(json).SelectToken("data").ToString();
    var data = JsonConvert.DeserializeObject<RootObject>(dataJson);
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...