이 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 개체 (예 : { “name”: “value”})가 필요하기 때문에 현재 JSON 배열 (예 : [1,2,3])을 ‘test.Model.RetrieveMultipleResponse’형식으로 역 직렬화 할 수 없습니다. 이 오류를 수정하려면 JSON을 JSON 개체 (예 : { “name”: “value”})로 변경하거나 deserialized 형식을 배열 또는 List와 같은 컬렉션 인터페이스 (예 : ICollection, IList)를 구현하는 형식으로 변경합니다. JSON 배열에서 역 직렬화됩니다. JsonArrayAttribute를 유형에 추가하여 JSON 배열에서 강제로 역 직렬화 할 수도 있습니다. 경로 ”, 줄 1, 위치 1
답변
json 문자열은 대괄호 ( []
)로 묶여 있으므로 단일 RetrieveMultipleResponse
객체가 아닌 배열로 해석됩니다 . 따라서 RetrieveMultipleResponse
예를 들어 collection의 형식으로 역 직렬화해야합니다 .
var objResponse1 =
JsonConvert.DeserializeObject<List<RetrieveMultipleResponse>>(JsonStr);
답변
Generics (확장 방법에서)를 지원하려면 이것이 패턴입니다.
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();
답변
var objResponse1 =
JsonConvert.DeserializeObject<List<RetrieveMultipleResponse>>(JsonStr);
작동했습니다!
답변
이것을 사용하면 FrontData
JSON 문자열입니다.
var objResponse1 = JsonConvert.DeserializeObject<List<DataTransfer>>(FrontData);
및 추출 목록 :
var a = objResponse1[0];
var b = a.CustomerData;