无法反序列化当前 JSON 数组 - Auth0 管理 API 端点 - 尽管使用在线 POCO 生成器
Cannot deserialize the current JSON array - Auth0 Management API Endpoint - despite using online POCO generators
我正在使用 Auth0 管理 API 端点,这个问题。
这是我的休息密码。
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 代的另一个来源,https://app.quicktype.io/。我得到完全相同的错误。
- 我已经检查了 json 的有效性。格式正确。
- 即使是手绘图,这也是直截了当的json。
- 此外,我注意到用户 class 的名称和 collection 的名称都是相同的。因此,我更改了用户 class 的名称。 (它在调试时从来没有给出任何错误,但我还是改变了它)。错误无变化
- 当生成 classes 时,我在调试期间直接从实时响应中获取 json 字符串,来自 IRestResponse response.content,以防在线 API文档出错了。
- 我查看了其他堆栈问题,在那些情况下,我注意到存在一些与没有列表相关的错误。在这里,我肯定已经将返回数组映射(在线生成器不会犯这样的错误)到列表中。
在我看来你正在反序列化到错误的 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);
我正在使用 Auth0 管理 API 端点,这个问题。
这是我的休息密码。
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 代的另一个来源,https://app.quicktype.io/。我得到完全相同的错误。
- 我已经检查了 json 的有效性。格式正确。
- 即使是手绘图,这也是直截了当的json。
- 此外,我注意到用户 class 的名称和 collection 的名称都是相同的。因此,我更改了用户 class 的名称。 (它在调试时从来没有给出任何错误,但我还是改变了它)。错误无变化
- 当生成 classes 时,我在调试期间直接从实时响应中获取 json 字符串,来自 IRestResponse response.content,以防在线 API文档出错了。
- 我查看了其他堆栈问题,在那些情况下,我注意到存在一些与没有列表相关的错误。在这里,我肯定已经将返回数组映射(在线生成器不会犯这样的错误)到列表中。
在我看来你正在反序列化到错误的 class,请尝试使用:JsonConvert.DeserializeObject
(看起来 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);