Không thể giải không hóa mảng JSON (ví dụ: [1,2,3]) thành kiểu '' vì kiểu yêu cầu đối tượng JSON (ví dụ: {“name”: “value”}) giải không chính xác


99

Tôi có JSON này:

[
    {
        "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"
    }
]

Và tôi có những lớp học này:

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; }
}

Tôi đang cố gắng giải mã JSON ở trên bằng cách sử dụng mã bên dưới:

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

nhưng tôi gặp lỗi này:

Không thể giải không khí mảng JSON hiện tại (ví dụ: [1,2,3]) thành kiểu 'test.Model.RetrieveMultipleResponse' vì kiểu này yêu cầu một đối tượng JSON (ví dụ: {"name": "value"}) để giải không chính xác. Để khắc phục lỗi này, hãy thay đổi JSON thành một đối tượng JSON (ví dụ: {"name": "value"}) hoặc thay đổi kiểu deserialized thành mảng hoặc kiểu triển khai giao diện bộ sưu tập (ví dụ: ICollection, IList) như List có thể được deserialized khỏi một mảng JSON. JsonArrayAttribute cũng có thể được thêm vào kiểu để buộc nó giải không khí khỏi một mảng JSON. Đường dẫn '', dòng 1, vị trí 1.

Câu trả lời:


160

Chuỗi json của bạn được bao bọc trong dấu ngoặc vuông ( []), do đó nó được hiểu là mảng thay vì RetrieveMultipleResponseđối tượng đơn lẻ . Do đó, bạn cần giải mã hóa nó để nhập bộ sưu tập RetrieveMultipleResponse, ví dụ:

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

Tôi đã phải xóa "//" befor "[", sau đó nó hoạt động với tôi. cảm ơn
garish

1
Nếu bạn muốn giữ nó dưới dạng một đối tượng duy nhất thay vì một tập hợp, bạn có thể thực hiện JsonStr.Replace ("[", ""). Replace ("]", "") hay cách này không tốt?
Phong phú

FYI điều này không hiệu quả với tôi vì tôi đang lấy JSON của mình từ một API và tôi đã nhầm URL đáng sợ trong cả ngày. > <
w00ngy

1
RetrieveMultipleResponse ở đây là gì?
Quái đản

Cảm ơn điều này đã làm việc cho tôi var objResponse1 = JsonConvert.DeserializeObject <List <QuestionData>> (srt); // myWord = myQuestionData.Word; Debug.Log ("myWord" + objResponse1 [0] .Word);
StackBuddy

10

Nếu ai đó muốn hỗ trợ Generics (trong một phương pháp mở rộng) thì đây là mẫu ...

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

Nó được sử dụng như thế này:

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

MyClassType trông giống như thế này (phải khớp với các cặp giá trị tên của mảng 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; }
 }

Sử dụng NUGET để tải xuống Newtonsoft.Json thêm tài liệu tham khảo nếu cần ...

using Newtonsoft.Json;



0

Sử dụng cái này, FrontDatalà chuỗi JSON:

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

và trích xuất danh sách:

var a = objResponse1[0];
var b = a.CustomerData;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.