#json.net #auth0 #restsharp
#json.net #auth0 #restsharp
Вопрос:
Я работаю с конечными точками API управления Auth0, проблема с этим.
Вот мой код 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);