JSON 배열 (예 : [1,2,3])을 ''유형으로 역 직렬화 할 수 없습니다. 올바른 역 직렬화를 위해서는 JSON 개체 (예 : {“name”:“value”})가 필요하기 때문입니다.


99

이 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

답변:


160

json 문자열은 대괄호 ( [])로 묶여 있으므로 단일 RetrieveMultipleResponse객체가 아닌 배열로 해석됩니다 . 따라서 RetrieveMultipleResponse예를 들어 collection의 형식으로 역 직렬화해야합니다 .

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

나는 "["를 위해 "//"를 제거해야만했다. 그리고 그것은 나를 위해 일했다. 감사
번쩍 거리는

1
컬렉션이 아닌 단일 객체로 유지하려면 JsonStr.Replace ( "[", ""). Replace ( "]", "")를 수행 할 수 있습니까? 아니면 좋은 방법이 아닐까요?
Rich

참고로 API에서 JSON을 가져 왔고 하루 종일 이상한 URL이 잘못 되었기 때문에 이것이 저에게 효과적이지 않았습니다. > <
w00ngy

1
여기서 RetrieveMultipleResponse는 무엇입니까?
Freakishly

감사합니다. var objResponse1 = JsonConvert.DeserializeObject <List <QuestionData >> (srt); // myWord = myQuestionData.Word; Debug.Log ( "myWord"+ objResponse1 [0] .Word);
StackBuddy

10

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;



0

이것을 사용하면 FrontDataJSON 문자열입니다.

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

및 추출 목록 :

var a = objResponse1[0];
var b = a.CustomerData;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.