无法反序列化当前 JSON 数组 - Auth0 管理 API 端点 - 尽管使用在线 POCO 生成器

Cannot deserialize the current JSON array - Auth0 Management API Endpoint - despite using online POCO generators

我正在使用 Auth0 管理 API 端点,这个问题。

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

这是我的休息密码。

    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"
  }
]

此时,我使用在线 class 生成器,例如 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.

我还尝试了一些东西。

在我看来你正在反序列化到错误的 class,请尝试使用:JsonConvert.DeserializeObject(myJsonResponse)

(看起来 Thomas 已经提供了一个我自己也发现的解决方案。在这里发布一些额外的细节。)

最终,这似乎对我有用。

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

我想,问题是,我正在寻找一个解决方案,我想要这样的解决方案。

myDeserializedClass

而且,我可以像这样使用它,

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

但是,我认为这不是 JSON 的工作方式。也许,如果 JSON 主体中还有其他字段,混合搭配集合和 non-collection 值。因为,这是一个完整的集合,外层被淘汰了或什么的。

此外,Quicktype class 生成器在顶部清楚地说明了这一点。

// <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);