Не удается десериализовать текущий массив JSON — Конечная точка API управления Auth0 — несмотря на использование онлайн-генераторов POCO

#json.net #auth0 #restsharp

#json.net #auth0 #restsharp

Вопрос:

Я работаю с конечными точками API управления Auth0, проблема с этим.

https://auth0.com/docs/api/management/v2?_ga=2.197148647.957265821.1601726170-1678439180.1588036522#!/Users/get_users

Вот мой код rest.

     var client = new RestClient(tempapiendpoint);
    var request = new RestRequest(Method.GET);
    request.AddHeader(header, bearerstring);
    request.AddParameter(specificfieldname,specificfields);
    request.AddParameter(includefieldname, includetrueorfalse);
    IRestResponse response = await client.ExecuteAsync(request);
    var myDeserializedClass = JsonConvert.DeserializeObject<Root>(response.Content);
  

У меня следующий ответ.

 [
  {
    "email": "somevalue",
    "name": "somevalue",
    "nickname": "somevalue",
    "user_id": "somevalue"
  },
  {
    "email": "somevalue",
    "name": "somevalue",
    "nickname": "somevalue",
    "user_id": "somevalue"
  },
  {
    "email": "somevalue",
    "name": "somevalue",
    "nickname": "somevalue",
    "user_id": "somevalue"
  }
]
  

На данный момент я использую онлайн-генератор классов, например, https://json2csharp.com /

 // Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse); 
    public class MyArray    {
        [JsonProperty("email")]
        public string Email; 

        [JsonProperty("name")]
        public string Name; 

        [JsonProperty("nickname")]
        public string Nickname; 

        [JsonProperty("user_id")]
        public string UserId; 
    }

    public class Root    {
        [JsonProperty("MyArray")]
        public List<MyArray> MyArray; 
    }
  

и каждый раз я получаю одну и ту же ошибку.

 Newtonsoft.Json.JsonSerializationException: Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'RandomStuffGeneratorPrivate.POCO.Root' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.

To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.

Path '', line 1, position 1.
  

Еще несколько вещей, которые я пробовал.

  • Я попробовал другой источник для генерации классов, https://app.quicktype.io /. Я получаю точно такую же ошибку.
  • Я проверил json на достоверность. он находится в правильном формате.
  • даже если вручную сопоставить его, это прямой json.
  • Кроме того, я заметил, что имя пользовательского класса и имя коллекции совпадают. Итак, я изменил имя для пользовательского класса. (он никогда не выдавал никаких ошибок при отладке, но я все равно изменил его). ошибка не изменилась
  • При создании классов я беру строку json непосредственно из текущего ответа во время отладки, из IRestResponse response.content, на случай, если в документации онлайн-API допущена ошибка.
  • я рассмотрел другие вопросы о стеке, и в этих случаях я заметил, что произошла какая-то ошибка, связанная с отсутствием списка. Здесь я определенно сопоставил (онлайн-генераторы не допустят такой ошибки) возвращаемый массив в список.

Комментарии:

1. Вставка вашего примера JSON в app.quicktype. для меня io работает просто отлично. Вы уверены, что в ваших необработанных данных нет скрытых управляющих символов, спецификаций или чего-либо еще?

2. окончательно. я подтверждаю, что то, что я получаю, соответствует образцу ответа online API Explorer. Я могу использовать любой из этих двух в качестве источника json, и в обоих случаях я получаю одни и те же классы.

Ответ №1:

Мне кажется, что вы десериализуете не в тот класс, попробуйте использовать: JsonConvert .DeserializeObject<myArray[]>(myJsonResponse)

Ответ №2:

(похоже, Томас уже предоставил решение, которое я также обнаружил самостоятельно. Публикуем некоторые дополнительные подробности здесь.)

В конечном счете, это, похоже, сработало для меня.

 var myDeserializedClass = JsonConvert.DeserializeObject<List<SingleUser>>(response.Content);
  

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

 myDeserializedClass
  

и я мог бы использовать это, например,

 var nameOfPerson =  myDeserializedClass.MyArray[0].Name;
  

Но я думаю, что это не так, как работает JSON. Возможно, если бы в теле JSON были другие поля с сочетанием и совпадением значений коллекции и не коллекции. Поскольку это была полная коллекция, внешний уровень устраняется или что-то в этом роде.

Кроме того, генератор классов Quicktype четко говорит об этом вверху.

 // <auto-generated />
//
// To parse this JSON data, add NuGet 'Newtonsoft.Json' then do:
//
//    using RandomStuffGeneratorPrivate.POCO;
//
//    var allUsers445 = AllUsers445.FromJson(jsonString);
  

и функция определяется следующим образом.

 public static List<AllUsers445> FromJson(string json) => JsonConvert.DeserializeObject<List<AllUsers445>>(json, RandomStuffGeneratorPrivate.POCO.Converter.Settings);