0

Не могли бы мне помочь) Я тут пытаюсь узнать номер кошелька от киви по токену и для этого мне надо через Json узнать его personalId. То есть я получаю данный ответ. Сейчас в консоле я получаю такой ответ. И из этого всего мне надо как-то достать PersonalId использую RestSharp

    public string GetQiwiNumber()
    {
        var client = new RestClient("https://edge.qiwi.com/person-profile/v1/profile/current");
        var request = new RestRequest(Method.GET);
        request.AddHeader("Content-Type", "application/json");
        request.AddHeader("Accept", "application/json");
        request.AddHeader("Authorization", $"Bearer {Token}");
        request.AddParameter("application/json", ParameterType.RequestBody);
        IRestResponse response = client.Execute(request);\
        string content = response.Content;
        return content;
    }

Json код взят от сюда: https://developer.qiwi.com/ru/qiwi-wallet-personal/?http#profile

Я походу чего-то не понимаю. Всё сделал как мне подсказали в ответе, но всё равно не работает)

    public string GetQiwiNumber()
    {
        var client = new RestClient("https://edge.qiwi.com/person-profile/v1/profile/current");
        var request = new RestRequest(Method.GET);
        request.AddHeader("Content-Type", "application/json");
        request.AddHeader("Accept", "application/json");
        request.AddHeader("Authorization", $"Bearer {Token}");
        request.AddParameter("application/json", ParameterType.RequestBody);
        IRestResponse response = client.Execute(request);
        JObject j = JObject.Parse(response.Content);
        JToken item = j.SelectToken("$.personId");
        if (item != null)
        {
            string personId = (string)item;
            return personId;
        }
        else
        {
            return "0";
        }
    }
pled
  • 379
  • Минус вопросу за код картинками. Пожалуйста, прикладывайте код текстом! – A K Apr 14 '21 at 07:06
  • @A K, извините, сейчас всё исправлю. Я просто хотел вставить Json код, он вставляется просто в строку из-за этого всё кинул скринами. – pled Apr 14 '21 at 07:23
  • А Json то где??? – Blackmeser Apr 14 '21 at 07:55
  • @Blackmeser - автор вопроса, видимо, предполагал, что JSON мы можем взять из примера на сайте у Киви. ссылка на сайт в вопросе есть. – S.H. Apr 14 '21 at 08:01
  • @S.H. Ну тогда тему вопроса следует сменить на: Как десериализировать Json из примера по ссылке на сайт с поломанным (или кривым) дизайном, и неизвестно какой секцией примера. Вопрос из разряда: помоги, но при этом сам пойди, найди, да разберись. – Blackmeser Apr 14 '21 at 08:13
  • @Blackmeser - я с вами согласен, но я уже нашел и вставил в ответ! – S.H. Apr 14 '21 at 08:20
  • @Blackmeser - автор в примечании пишет, что первый раз с JSON работает - ну, что поделать, растерялся человек. Может, и не надо его сильно ругать. Меня, например, больше инетерсует, получится ли у автора сделать решение, основанное на "коротком пути" из п.4 моего ответа. – S.H. Apr 14 '21 at 08:26
  • Снял минус. Вам уже написали ответ, подобных вопросов уже немало на сайте оставлено, поэтому можно поискать более подробные ответы, например https://ru.stackoverflow.com/q/829895/213987 или https://ru.stackoverflow.com/q/829577/213987 - возможно поможет лучше разобраться. – A K Apr 14 '21 at 09:20
  • 1
    @ДмитрийСтепанов что именно не работает, вы хотя-бы полученный json предоставьте, если он корректен, то извлечь необходимые вам данные можно очень просто в 2-3 строки: using System.Text.RegularExpressions; Match m = new Regex(""personId":(?.*?),").Match(json_string); return m.Success ? m.Groups["name"].Value.Trim() : "0"; – Blackmeser Apr 14 '21 at 09:48
  • 1
    @Blackmeser - да, кстати, хороший способ, котрый не пришел мне в голову! – S.H. Apr 14 '21 at 09:50

1 Answers1

2

Сначала -короткий ответ:

        JToken item = j.SelectToken("$.authInfo.personId");
        long personId = (long)item;

При этм надодобавить зависимость - Newtonsoft.Json, например, через NuGet: install-Package Newtonsoft.Json.

А вообще - есть еще такие способы:

  1. Берем данные, указанные на первом скриншоnt - сожержимое JSON. Идём на сервис https://json2csharp.com/. Этот сервис по JSON сгенерирует "приблизительно подходящий" класс C#, в который можно десериализовывать данные. Пусть у Вас в коде этот класс убдет называться AuthInfo

  2. Теперь можно сделать простую опреацию по десериализации, что то вроде AuthInfo answer = JsonConvert.DeserializeObject<AuthInfo>(rawJson);

В принципе, если бы в вопросе JSON был текстом - то можно было бы всё это проделать, пока я писал ответ.

  1. Еще один способ - написать нужный класс AuthInfo руками, тогда можно включить туда буквально одно два необходимых поля. Тогда при десериализации всё остальное содерждимое JSON будет просто проигнорировано

  2. Дополняю ответ.

Мне в голову пришло, что можно пойти ещё более простым путём:

        JObject j = JObject.Parse(rawjson);
        JToken item = j.SelectToken("$.personId");
        if (item != null)
            string peronslId = (string) item;

Ну, если я где то ошибся - то, скорее всего, когад переписывал со скриншота имена. А так - должно работать!

  1. Дополняю ответ еще раз, после того,к ак автор подправил вопрос: Конвертирование JSON'а

     {
       "authInfo": {
         "boundEmail": "m@ya.ru",
         "ip": "81.210.201.22",
         "lastLoginDate": "2017-07-27T06:51:06.099Z",
         "mobilePinInfo": {
           "lastMobilePinChange": "2017-07-13T11:22:06.099Z",
           "mobilePinUsed": true,
           "nextMobilePinChange": "2017-11-27T06:51:06.099Z"
         },
         "passInfo": {
           "lastPassChange": "2017-07-21T09:25:06.099Z",
           "nextPassChange": "2017-08-21T09:25:06.099Z",
           "passwordUsed": true
         },
         "personId": 79683851815,
         "pinInfo": {
           "pinUsed": true
         },
         "registrationDate": "2017-01-07T16:51:06.100Z"
       },
       "contractInfo": {
         "blocked": false,
         "contractId": 79683851815,
         "creationDate": "2017-01-07T16:51:06.100Z",
         "features": [],
         "identificationInfo": [
           {
             "bankAlias": "QIWI",
             "identificationLevel": "SIMPLE"
           }
         ]
       },
       "userInfo": {
         "defaultPayCurrency": 643,
         "defaultPaySource": 7,
         "email": null,
         "firstTxnId": 10807097143,
         "language": "string",
         "operator": "Beeline",
         "phoneHash": "lgsco87234f0287",
         "promoEnabled": null
       }
     }               
    

дало нам код класса, опиывающего JSON - объект полностью:

    // Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse); 
        public class MobilePinInfo
        {
            public DateTime lastMobilePinChange { get; set; }
            public bool mobilePinUsed { get; set; }
            public DateTime nextMobilePinChange { get; set; }
        }
    public class PassInfo
    {
        public DateTime lastPassChange { get; set; }
        public DateTime nextPassChange { get; set; }
        public bool passwordUsed { get; set; }
    }

    public class PinInfo
    {
        public bool pinUsed { get; set; }
    }

    public class AuthInfo
    {
        public string boundEmail { get; set; }
        public string ip { get; set; }
        public DateTime lastLoginDate { get; set; }
        public MobilePinInfo mobilePinInfo { get; set; }
        public PassInfo passInfo { get; set; }
        public long personId { get; set; }
        public PinInfo pinInfo { get; set; }
        public DateTime registrationDate { get; set; }
    }

    public class IdentificationInfo
    {
        public string bankAlias { get; set; }
        public string identificationLevel { get; set; }
    }

    public class ContractInfo
    {
        public bool blocked { get; set; }
        public long contractId { get; set; }
        public DateTime creationDate { get; set; }
        public List&lt;object&gt; features { get; set; }
        public List&lt;IdentificationInfo&gt; identificationInfo { get; set; }
    }

    public class UserInfo
    {
        public int defaultPayCurrency { get; set; }
        public int defaultPaySource { get; set; }
        public object email { get; set; }
        public long firstTxnId { get; set; }
        public string language { get; set; }
        public string @operator { get; set; }
        public string phoneHash { get; set; }
        public object promoEnabled { get; set; }
    }

    public class Root
    {
        public AuthInfo authInfo { get; set; }
        public ContractInfo contractInfo { get; set; }
        public UserInfo userInfo { get; set; }
    }

И вот - ура-ура- в AuthInfo мы видим требуемый personId.

Но я настаиваю, что более короткий способ, описанный в пункте 4 - лучше

Успехов!

S.H.
  • 11,065
  • 1
  • 24
  • 46
  • здравствуйте. Я перехожу на сайт https://json2csharp.com/ вставляю код он мне кидает ошибку. И дополнение почему-то не работает, хотя всё верно. Я вопрос изменил. С Json работаю впервые и ещё не знаю как всё работает) – pled Apr 14 '21 at 07:37
  • Ошибка - потому, что формально приведенный у киви пример - с ошибкой: в json не бывает многоточий. Нужно вырезать многолочие из приведенной у них портянки - тогда конвертирование сработает – S.H. Apr 14 '21 at 07:50
  • я изменил вопрос) – pled Apr 14 '21 at 09:16
  • @ДмитрийСтепанов - там надо было правильный путь прописать. Посмотрите начало ответа, я его поправил – S.H. Apr 14 '21 at 09:48
  • 2
    разобрался, всё работает. Спасибо вам большое – pled Apr 14 '21 at 09:59