ไม่สามารถแยกซีเรียลไลซ์อาร์เรย์ JSON (เช่น [1,2,3]) เป็นประเภท '' ได้เนื่องจากประเภทต้องใช้ออบเจ็กต์ JSON (เช่น {“ name”:“ value”}) เพื่อแยกค่าซีเรียลออกอย่างถูกต้อง


108

ฉันมี 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);

แต่ฉันได้รับข้อผิดพลาดนี้:

ไม่สามารถ deserialize อาร์เรย์ JSON ปัจจุบัน (เช่น [1,2,3]) ลงในประเภท 'test.Model.RetrieveMultipleResponse' ได้เนื่องจากประเภทนั้นต้องการออบเจ็กต์ JSON (เช่น {"name": "value"}) เพื่อแยกส่วนออกให้ถูกต้อง หากต้องการแก้ไขข้อผิดพลาดนี้ให้เปลี่ยน JSON เป็นออบเจ็กต์ JSON (เช่น {"name": "value"}) หรือเปลี่ยนประเภท deserialized เป็นอาร์เรย์หรือประเภทที่ใช้อินเทอร์เฟซการรวบรวม (เช่น ICollection, IList) เช่นรายการที่สามารถ ถูก deserialized จากอาร์เรย์ JSON นอกจากนี้ยังสามารถเพิ่ม JsonArrayAttribute ลงในประเภทเพื่อบังคับให้ deserialize จากอาร์เรย์ JSON เส้นทาง '' บรรทัด 1 ตำแหน่ง 1

คำตอบ:


173

สตริง json ของคุณถูกห่อไว้ในวงเล็บเหลี่ยม ( []) ดังนั้นจึงถูกตีความว่าเป็นอาร์เรย์แทนที่จะเป็นRetrieveMultipleResponseวัตถุเดี่ยว ดังนั้นคุณต้อง deserialize เพื่อพิมพ์ collection RetrieveMultipleResponseตัวอย่างเช่น:

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

ฉันต้องลบ "//" befor "[" แล้วมันก็ใช้ได้สำหรับฉัน ขอบคุณ
หรูหรา

1
หากคุณต้องการเก็บไว้เป็นวัตถุชิ้นเดียวแทนที่จะเป็นคอลเลกชันคุณสามารถทำได้เพียงแค่ทำ JsonStr.Replace ("[", "") แทนที่ ("]", "") หรือจะไม่เป็นการปฏิบัติที่ดี?
รวย

FYI สิ่งนี้ไม่ได้ผลสำหรับฉันเพราะฉันได้รับ JSON จาก API และฉันมี URL ที่ผิดพลาดตลอดทั้งวัน > <
w00ngy

1
RetrieveMultipleResponse คืออะไรที่นี่?
ประหลาด

ขอบคุณสิ่งนี้ใช้ได้กับฉัน 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;

4

ไม่สามารถเพิ่มความคิดเห็นในการแก้ปัญหา แต่ไม่ได้ผลสำหรับฉัน วิธีแก้ปัญหาที่ได้ผลสำหรับฉันคือใช้:

var des = (MyClass)Newtonsoft.Json.JsonConvert.DeserializeObject(response, typeof(MyClass)); 
return des.data.Count.ToString();

การแยกข้อมูลอาร์เรย์ JSON ลงในวัตถุ. NET ที่พิมพ์แน่นหนา


0

ใช้สิ่งนี้FrontDataคือสตริง JSON:

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

และแยกรายการ:

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

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

ได้ผล!


สิ่งนี้ไม่ได้ให้คำตอบสำหรับคำถาม เมื่อคุณมีเพียงพอชื่อเสียงคุณจะสามารถที่จะแสดงความคิดเห็นในโพสต์ใด ๆ ; แทนที่จะให้คำตอบที่ไม่จำเป็นต้องชี้แจงจากผู้ถาม - จากรีวิว
mike
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.