programing

유형을 사용하려면 JSON 개체(예: {"name" ""value"")가 필요하므로 JSON 어레이(예: [1,2,3])를 유형 '으로 역직렬화할 수 없습니다.

abcjava 2023. 3. 22. 20:35
반응형

유형을 사용하려면 JSON 개체(예: {"name" ""value"")가 필요하므로 JSON 어레이(예: [1,2,3])를 유형 '으로 역직렬화할 수 없습니다.

다음 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")로 변경하거나, 역직렬화된 유형을 JSON 어레이에서 역직렬화할 수 있는 수집 인터페이스(예: ICollection, IList)를 구현하는 유형으로 변경하십시오.JsonArrayAttribute를 유형에 추가하여 JSON 어레이에서 강제로 역직렬화할 수도 있습니다.패스 ', 라인 1, 위치 1

json 문자열은 대괄호( )로 둘러싸여 있습니다.[])따라서 싱글이 아닌 어레이로 해석됩니다.RetrieveMultipleResponse물건.따라서 deserialize를 실행하여 collection을 타입으로 해야 합니다.RetrieveMultipleResponse예를 들어 다음과 같습니다.

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

JSON 배열을 strong type으로 역직렬화하고 있습니다.NET 객체

이걸 쓰세요.FrontDataJSON 문자열:

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

및 추출 목록:

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

첫 번째 요소(Key)를 추출하려면 다음 방법을 사용해 보십시오.다른 요소(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();
            }
        }
var objResponse1 = 
JsonConvert.DeserializeObject<List<RetrieveMultipleResponse>>(JsonStr);

동작했다!

언급URL : https://stackoverflow.com/questions/22557559/cannot-deserialize-the-json-array-e-g-1-2-3-into-type-because-type-requ

반응형