JSON dizisi (ör. [1,2,3]) '' türüne kaldırılamaz çünkü tür, doğru şekilde seriyi kaldırmak için JSON nesnesi (ör. {"Ad": "değer"}) gerektirir


109

Bu JSON'a sahibim:

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

Ve şu derslerim var:

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

Aşağıdaki kodu kullanarak yukarıdaki JSON'un seri halini kaldırmaya çalışıyorum:

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

ama bu hatayı alıyorum:

Geçerli JSON dizisi (ör. [1,2,3]) 'test.Model.RetrieveMultipleResponse' türüne kaldırılamaz çünkü tür, doğru bir şekilde seriyi kaldırmak için bir JSON nesnesi (ör. {"Name": "değer"}) gerektirir. Bu hatayı düzeltmek için ya JSON'yi bir JSON nesnesine (ör. {"Name": "değer"}) değiştirin veya serileştirilmemiş türü bir dizi veya bir koleksiyon arabirimi (ör. ICollection, IList) uygulayan bir tür olarak değiştirin (ör. ICollection, IList) JSON dizisinden serileştirilmemiş hale getirilebilir. JsonArrayAttribute, bir JSON dizisinden seriyi kaldırmaya zorlamak için türe de eklenebilir. Yol '', satır 1, konum 1.

Yanıtlar:


174

Json dizeniz köşeli parantezler ( []) içine alınır, bu nedenle tek RetrieveMultipleResponsenesne yerine dizi olarak yorumlanır . Bu nedenle, RetrieveMultipleResponseörneğin koleksiyon türünde seri durumdan çıkarmanız gerekir , örneğin:

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

"[" İçin "//" öğesini kaldırmak zorunda kaldım, sonra benim için çalıştı. teşekkürler
garish

2
Bir koleksiyon yerine tek bir nesne olarak tutmak isteseydiniz, JsonStr.Replace ("[", ""). Değiştir ("]", "") yapabilir miydiniz yoksa bu iyi bir uygulama olmaz mıydı?
Zengin

Bilginize bu benim için işe yaramadı çünkü JSON'umu bir API'den alıyordum ve tüm gün boyunca acayip URL'yi yanlış aldım. > <
w00ngy

1
RetrieveMultipleResponse burada nedir?
Freakishly

Teşekkürler bu benim için çalıştı var objResponse1 = JsonConvert.DeserializeObject <List <QuestionData>> (srt); // myWord = myQuestionData.Word; Debug.Log ("myWord" + objResponse1 [0] .Word);
StackBuddy

10

Biri Generics'i desteklemek isterse (bir uzatma yönteminde) bu modeldir ...

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

Şu şekilde kullanılır:

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

MyClassType şuna benzer (JSON dizisinin ad değer çiftleriyle eşleşmelidir)

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

Newtonsoft.Json'ı indirmek için NUGET kullanın, gerektiğinde bir referans ekleyin ...

using Newtonsoft.Json;


0

Bunu kullanın FrontData, JSON dizesidir:

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

ve listeyi çıkar:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.