无法将 JSON 数组(例如[1,2,3])反序列化为类型“”,因为类型要求 JSON 对象(例如{“ name”: “ value”})正确反序列化

我有这个 JSON:

[
{
"Attributes": [
{
"Key": "Name",
"Value": {
"Value": "Acc 1",
"Values": [
"Acc 1"
]
}
},
{
"Key": "Id",
"Value": {
"Value": "1",
"Values": [
"1"
]
}
}
],
"Name": "account",
"Id": "1"
},
{
"Attributes": [
{
"Key": "Name",
"Value": {
"Value": "Acc 2",
"Values": [
"Acc 2"
]
}
},
{
"Key": "Id",
"Value": {
"Value": "2",
"Values": [
"2"
]
}
}
],
"Name": "account",
"Id": "2"
},
{
"Attributes": [
{
"Key": "Name",
"Value": {
"Value": "Acc 3",
"Values": [
"Acc 3"
]
}
},
{
"Key": "Id",
"Value": {
"Value": "3",
"Values": [
"3"
]
}
}
],
"Name": "account",
"Id": "2"
}
]

我有这些课程:

public class RetrieveMultipleResponse
{
public List<Attribute> Attributes { get; set; }
public string Name { get; set; }
public string Id { get; set; }
}


public class Value
{
[JsonProperty("Value")]
public string value { get; set; }
public List<string> Values { get; set; }
}


public class Attribute
{
public string Key { get; set; }
public Value Value { get; set; }
}

我尝试使用下面的代码对上面的 JSON 进行反序列化:

var objResponse1 = JsonConvert.DeserializeObject<RetrieveMultipleResponse>(JsonStr);

但我得到了这个错误:

无法将当前 JSON 数组(例如[1,2,3])反序列化为类型 因为该类型需要一个 JSON 对象(例如{“ name”: “ value”})来正确反序列化 错误或者将 JSON 更改为 JSON 对象(例如{“ name”: “ value”}) 或将反序列化类型更改为数组或实现 像 List 这样的集合接口(例如 ICollection、 IList) 从 JSON 数组反序列化。 JsonArrayAttribute 也可以是 添加到类型以强制它从 JSON 数组反序列化 第一行,第一个位置。

327081 次浏览

Json 字符串包装在方括号([])中,因此它被解释为数组,而不是单个 RetrieveMultipleResponse对象。因此,您需要将其反序列化为 RetrieveMultipleResponse的类型集合,例如:

var objResponse1 =
JsonConvert.DeserializeObject<List<RetrieveMultipleResponse>>(JsonStr);

如果想要支持泛型(在扩展方法中) ,这就是模式..。

public  static List<T> Deserialize<T>(this string SerializedJSONString)
{
var stuff = JsonConvert.DeserializeObject<List<T>>(SerializedJSONString);
return stuff;
}

它是这样使用的:

var rc = new MyHttpClient(URL);
//This response is the JSON Array (see posts above)
var response = rc.SendRequest();
var data = response.Deserialize<MyClassType>();

MyClassType 如下所示(必须匹配 JSON 数组的名称值对)

[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
public class MyClassType
{
[JsonProperty(PropertyName = "Id")]
public string Id { get; set; }


[JsonProperty(PropertyName = "Name")]
public string Name { get; set; }


[JsonProperty(PropertyName = "Description")]
public string Description { get; set; }


[JsonProperty(PropertyName = "Manager")]
public string Manager { get; set; }


[JsonProperty(PropertyName = "LastUpdate")]
public DateTime LastUpdate { get; set; }
}

使用 NUGET 下载 Newtonsoft. Json 在需要的地方添加引用..。

using Newtonsoft.Json;

不能在解决方案中添加注释,但这对我不起作用。对我有效的解决办法是:

var des = (MyClass)Newtonsoft.Json.JsonConvert.DeserializeObject(response, typeof(MyClass));
return des.data.Count.ToString();

将 JSON 数组反序列化为强类型的.NET 对象

var objResponse1 =
JsonConvert.DeserializeObject<List<RetrieveMultipleResponse>>(JsonStr);

成功了!

使用这个,FrontData是 JSON 字符串:

var objResponse1 = JsonConvert.DeserializeObject<List<DataTransfer>>(FrontData);

摘录清单:

var a = objResponse1[0];
var b = a.CustomerData;

要提取第一个元素(关键字) ,请尝试这个方法,其他方法也是如此:

        using (var httpClient = new HttpClient())
{
using (var response = await httpClient.GetAsync("Your URL"))
{
var apiResponse = await response.Content.ReadAsStringAsync();
var list = JObject.Parse(apiResponse)["Attributes"].Select(el => new {  Key= (string)el["Key"] }).ToList();
var Keys= list.Select(p => p.Key).ToList();
}
}