Tidak dapat menghilangkan derialisasi array JSON (mis. [1,2,3]) menjadi tipe '' karena tipe memerlukan objek JSON (mis. {"Name": "value"}) untuk deserialisasi dengan benar

98

Saya memiliki JSON ini:

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

Dan saya memiliki kelas-kelas ini:

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

Saya mencoba deserialize JSON di atas menggunakan kode di bawah ini:

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

tapi saya mendapatkan kesalahan ini:

Tidak dapat menghapus derialisasi array JSON saat ini (misalnya [1,2,3]) ke dalam tipe 'test.Model.RetrieveMultipleResponse' karena jenis tersebut memerlukan objek JSON (misalnya {"name": "value"}) untuk melakukan deserialisasi dengan benar. Untuk memperbaiki kesalahan ini, ubah JSON menjadi objek JSON (mis. {"Name": "value"}) atau ubah tipe deserialisasi menjadi larik atau tipe yang mengimplementasikan antarmuka koleksi (mis. ICollection, IList) seperti List yang dapat di-deserialized dari array JSON. JsonArrayAttribute juga dapat ditambahkan ke jenis untuk memaksanya melakukan deserialisasi dari array JSON. Path '', baris 1, posisi 1.

Avinash
sumber

Jawaban:

161

String json Anda dibungkus dalam tanda kurung siku ( []), oleh karena itu diartikan sebagai array, bukan RetrieveMultipleResponseobjek tunggal . Oleh karena itu, Anda perlu melakukan deserialisasi untuk mengetik koleksi RetrieveMultipleResponse, misalnya:

var objResponse1 = 
    JsonConvert.DeserializeObject<List<RetrieveMultipleResponse>>(JsonStr);
har07
sumber
Saya harus menghapus "//" sebelum "[", lalu berhasil untuk saya. terima kasih
norak
1
Jika Anda ingin menyimpannya sebagai objek tunggal dan bukan sebagai koleksi, dapatkah Anda melakukan JsonStr.Replace ("[", ""). Replace ("]", "") atau bukankah ini praktik yang baik?
Kaya
FYI ini tidak berhasil untuk saya karena saya mendapatkan JSON saya dari API dan saya memiliki URL aneh yang salah sepanjang hari. > <
w00ngy
1
Apa RetrieveMultipleResponse di sini?
Anehnya
Terima kasih ini berhasil untuk saya var objResponse1 = JsonConvert.DeserializeObject <List <QuestionData>> (srt); // myWord = myQuestionData.Word; Debug.Log ("myWord" + objResponse1 [0] .Word);
StackBuddy
10

Jika seseorang ingin mendukung Generik (dalam metode ekstensi) ini adalah polanya ...

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

Ini digunakan seperti ini:

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

MyClassType terlihat seperti ini (harus cocok dengan pasangan nilai nama dari array 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; }
 }

Gunakan NUGET untuk mendownload Newtonsoft.Json menambahkan referensi jika diperlukan ...

using Newtonsoft.Json;
John Peters
sumber
0

Gunakan ini, FrontDataadalah string JSON:

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

dan ekstrak daftar:

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