我有这个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])反序列化为类型 'test.Model.RetrieveMultipleResponse'因为类型需要JSON 对象(例如{“name”:“value”})正确反序列化。解决这个问题 错误要么将JSON更改为JSON对象(例如{“name”:“value”}) 或将反序列化类型更改为数组或实现的类型 可以像List一样的集合接口(例如ICollection,IList) 从JSON数组反序列化。 JsonArrayAttribute也可以 添加到类型以强制它从JSON数组反序列化。路径 '',第1行,第1位。
答案 0 :(得分:119)
您的json字符串包含在方括号([]
)中,因此它被解释为数组而不是单个RetrieveMultipleResponse
对象。因此,您需要将其反序列化为RetrieveMultipleResponse
的类型集合,例如:
var objResponse1 =
JsonConvert.DeserializeObject<List<RetrieveMultipleResponse>>(JsonStr);
答案 1 :(得分:7)
如果想要支持泛型(在扩展方法中),这就是模式......
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;
答案 2 :(得分:3)
无法在解决方案中添加评论,但这对我不起作用。对我有用的解决方案是使用:
var des = (MyClass)Newtonsoft.Json.JsonConvert.DeserializeObject(response, typeof(MyClass)); return des.data.Count.ToString();
答案 3 :(得分:0)
使用它,FrontData
是JSON字符串:
var objResponse1 = JsonConvert.DeserializeObject<List<DataTransfer>>(FrontData);
并提取列表:
var a = objResponse1[0];
var b = a.CustomerData;
答案 4 :(得分:0)
要提取第一个元素 (Key) 试试这个方法,其他方法也一样:
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();
}
}
答案 5 :(得分:-1)
var objResponse1 =
JsonConvert.DeserializeObject<List<RetrieveMultipleResponse>>(JsonStr);
工作了!