简体   繁体   English

将C#中的JSON数组反序列化为列表

[英]Deserialize a JSON array in c# into a list

I want to deserialize a json of this format into a List of objects. 我想将此格式的json反序列化为对象列表。 This is what my JSON looks like: 这是我的JSON的样子:

[{
        id : 3,
        vraag : "Op de keyserlei zijn er te weinig ...",
        fase_id : "1",
        antwoorden : [{
                id : 12,
                antwoord : "Bomen",
                inspraakvraag_id : "3",
                aantal_gekozen : "452"
            }, {
                id : 13,
                antwoord : "Vuilbakken",
                inspraakvraag_id : "3",
                aantal_gekozen : "777"
            }, {
                id : 14,
                antwoord : "Fietsstallingen",
                inspraakvraag_id : "3",
                aantal_gekozen : "456"
            }
        ]
    }, {
        id : 5,
        vraag : "Vind je dat er te veel geluidsoverlast in de binnenstad in het weekend",
        fase_id : "1",
        antwoorden : [{
                id : 18,
                antwoord : "Ja",
                inspraakvraag_id : "5",
                aantal_gekozen : "741"
            }, {
                id : 19,
                antwoord : "Nee",
                inspraakvraag_id : "5",
                aantal_gekozen : "147"
            }, {
                id : 20,
                antwoord : "Geen mening",
                inspraakvraag_id : "5",
                aantal_gekozen : "987"
            }
        ]
    }, {
        id : 4,
        vraag : "Welk van de volgende evenementen zou je graag zien op de groenplaats?",
        fase_id : "1",
        antwoorden : [{
                id : 15,
                antwoord : "Tuinbouw Expo",
                inspraakvraag_id : "4",
                aantal_gekozen : "785"
            }, {
                id : 16,
                antwoord : "Metal festival",
                inspraakvraag_id : "4",
                aantal_gekozen : "156"
            }, {
                id : 17,
                antwoord : "Counter strike LAN party",
                inspraakvraag_id : "4",
                aantal_gekozen : "456"
            }
        ]
    }, {
        id : 2,
        vraag : "In spark spoork noord zou ik graag ... zien",
        fase_id : "1",
        antwoorden : [{
                id : 6,
                antwoord : "Een speeltuin",
                inspraakvraag_id : "2",
                aantal_gekozen : "245"
            }, {
                id : 7,
                antwoord : "Een fabriek",
                inspraakvraag_id : "2",
                aantal_gekozen : "241"
            }, {
                id : 8,
                antwoord : "Een bos",
                inspraakvraag_id : "2",
                aantal_gekozen : "300"
            }
        ]
    }, {
        id : 1,
        vraag : "Voel je je 's avonds veilig in de stad Berchem?",
        fase_id : "1",
        antwoorden : [{
                id : 9,
                antwoord : "Ja",
                inspraakvraag_id : "1",
                aantal_gekozen : "452"
            }, {
                id : 10,
                antwoord : "Nee",
                inspraakvraag_id : "1",
                aantal_gekozen : "721"
            }, {
                id : 11,
                antwoord : "Niet van toepassing.",
                inspraakvraag_id : "1",
                aantal_gekozen : "123"
            }
        ]
    }
]

This is what my main code looks like: 这是我的主要代码:

var vraagTest = JsonUtility.FromJson<List<vraag>>(www.text);

my classes: 我的课程:

[System.Serializable]
public class vraag {

    public int id;
    public string vraagg;
    public int fase_id;
    public List<antwoorden> antwoorden;

}

and

[Serializable]
public class antwoorden {
    public int id;
    public string antwoord;
    public int inspraakvraag_id;
    public int aantal_gekozen;
}

I've tried some solutions on the internet but I keep getting the same error: 我在互联网上尝试了一些解决方案,但仍然遇到相同的错误:

ArgumentException: JSON must represent an object type.

I've also tried putting the first list into a different class, but I get the same problem: 我也尝试将第一个列表放到另一个类中,但是遇到了同样的问题:

    [Serializable]
public class vragenlijst{
    public List<vragenlijst> vragen;
}

EDIT 编辑

I fixed the problem! 我解决了这个问题! I fixed it by wrappin the JSON around an object, apparently JsonUtility "does not support array types for top-level JSON deserialization (like Info[]). You need to wrap the JSON in an object". 我通过将JSON环绕对象固定了它,显然JsonUtility“不支持用于顶级JSON反序列化的数组类型(如Info [])。您需要将JSON包装在一个对象中”。

This is my WORKING CODE: 这是我的工作代码:

{
vragen: [
{
id: 2,
vraag: "In spark spoork noord zou ik graag ... zien",
fase_id: "1",
antwoorden: [
{
id: 6,
antwoord: "Een speeltuin",
inspraakvraag_id: "2",
aantal_gekozen: "245"
},
{
id: 7,
antwoord: "Een fabriek",
inspraakvraag_id: "2",
aantal_gekozen: "241"
},
{
id: 8,
antwoord: "Een bos",
inspraakvraag_id: "2",
aantal_gekozen: "300"
}
]
},
{
id: 1,
vraag: "Voel je je 's avonds veilig in de stad Berchem?",
fase_id: "1",
antwoorden: [
{
id: 9,
antwoord: "Ja",
inspraakvraag_id: "1",
aantal_gekozen: "452"
},
{
id: 10,
antwoord: "Nee",
inspraakvraag_id: "1",
aantal_gekozen: "721"
},
{
id: 11,
antwoord: "Niet van toepassing.",
inspraakvraag_id: "1",
aantal_gekozen: "123"
}
]
},
{
id: 3,
vraag: "Op de keyserlei zijn er te weinig ...",
fase_id: "1",
antwoorden: [
{
id: 12,
antwoord: "Bomen",
inspraakvraag_id: "3",
aantal_gekozen: "452"
},
{
id: 13,
antwoord: "Vuilbakken",
inspraakvraag_id: "3",
aantal_gekozen: "777"
},
{
id: 14,
antwoord: "Fietsstallingen",
inspraakvraag_id: "3",
aantal_gekozen: "456"
}
]
}
]
}

Main code: 主要代码:

var vraagTest = JsonUtility.FromJson<vragenlijst>(www.text);

Classes: 类:

[Serializable]
public class vragenlijst{
    public List<Vraag> vragen;
}

,

[System.Serializable]
public class Vraag {

    public int id;
    public string vraag;
    public int fase_id;
    public List<antwoorden> antwoorden;

}

,

[Serializable]
public class antwoorden {
    public int id;
    public string antwoord;
    public int inspraakvraag_id;
    public int aantal_gekozen;
}

I assume you will need a list of vraag instead of vragenlijst in your vragenlijst -class: 我想你需要的清单vraag而不是vragenlijstvragenlijst -class:

[Serializable]
public class vragenlijst{
    public List<vraag> vragen;
}

Then use 然后使用

var vraagTest = JsonUtility.FromJson<vragenlijst>(www.text);

instead of 代替

var vraagTest = JsonUtility.FromJson<List<vraag>>(www.text);

because the type you want to deserialize is vragenlijst , not List<vraag> . 因为要反序列化的类型是vragenlijst ,而不是List<vraag>

[System.Serializable]
public class vraagClass
{

    public int id;
    public string vraag;
    public int fase_id;
    public List<antwoorden> antwoorden;

}
[Serializable]
public class antwoorden
{
    public int id;
    public string antwoord;
    public int inspraakvraag_id;
    public int aantal_gekozen;
}

[Serializable]
public class vragenlijst
{
    public List<vraagClass> vragen;
}
class Program
{
    static void Main(string[] args)
    {
        #region json
        string jsonText = "";

        #endregion

        using(StreamReader sr = new StreamReader(@"E:\WIP\DeserializeStackOverFlow\DeserializeStackOverFlow\Lib\abc.json"))
        {
            jsonText = sr.ReadToEnd();
        }


        var vraagTest = JsonConvert.DeserializeObject<List<vraagClass>>(jsonText);
    }
}

Just fix 2 things : 只需修复2件事:

  1. "vraag" Class can't have a property "vraag", so change the name of class [no issues as the json array isn't named ] “ vraag”类不能具有属性“ vraag”,因此更改类的名称[没有问题,因为json数组未命名]
  2. yeah as suggested by Bart, the deserializer needs to be List not the base "public List vragen;" 是的,正如Bart建议的那样,解串器必须是List,而不是基本的“ public List vragen”;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM