【问题标题】:Deserialize a JSON array in c# into a list将c#中的JSON数组反序列化为列表
【发布时间】:2016-05-27 13:23:56
【问题描述】:

我想将这种格式的 json 反序列化为对象列表。 这就是我的 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"
            }
        ]
    }
]

这是我的主要代码的样子:

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

我的课程:

[System.Serializable]
public class vraag {

    public int id;
    public string vraagg;
    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;
}

我在互联网上尝试了一些解决方案,但我一直收到同样的错误:

ArgumentException: JSON must represent an object type.

我也尝试将第一个列表放入不同的类,但我遇到了同样的问题:

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

编辑

我解决了这个问题!我通过将 JSON 包裹在一个对象周围来修复它,显然 JsonUtility “不支持顶级 JSON 反序列化的数组类型(如 Info [])。您需要将 JSON 包装在一个对象中”。

这是我的工作代码:

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

主要代码:

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

类:

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

【问题讨论】:

    标签: c# json serialization unity3d


    【解决方案1】:
    [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);
        }
    }
    

    只需修复两件事:

    1. “vraag”类不能有属性“vraag”,所以更改类的名称[没有问题,因为未命名 json 数组]
    2. 是的,正如 Bart 所建议的那样,反序列化程序必须是 List 而不是基本的“public List vragen;”

    【讨论】:

    • 我通过在 JSON 周围添加 { } 来修复它,显然 JsonUtility “不支持顶级 JSON 反序列化的数组类型(如 Info[])。您需要将 JSON 包装在一个对象中” .感谢您的帮助!
    • 将 JSOn 数组包裹在一个对象周围*我的意思是
    【解决方案2】:

    我假设您在vragenlijst-class 中需要vraag 而不是vragenlijst 的列表:

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

    然后使用

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

    而不是

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

    因为您要反序列化的类型是vragenlijst,而不是List&lt;vraag&gt;。

    【讨论】:

    • 我现在有这个:var vraagTest = JsonUtility.FromJson&lt;vragenlijst&gt;(www.text); 和这个:public class vragenlijst{ public List&lt;vraagg&gt; vragen; },但我仍然得到同样的错误
    • 您当然需要vraag 的列表,vraagg 希望是一个错字,不是吗?
    • 我使用它是因为我已经有一个名为 vraag 的变量,现在我使用了大写 V。我完全按照你说的做了,但我仍然得到同样的错误:/
    • 我通过将 JSON 包装在一个对象周围来修复它,显然 JsonUtility “不支持顶级 JSON 反序列化的数组类型(如 Info[])。您需要将 JSON 包装在一个对象中” .感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    相关资源
    最近更新 更多