在c#

时间:2017-02-25 17:15:34

标签: c# json serialization

我试图从这样的API调用反序列化多个Json对象:http://jservice.io/api/clues?category=2537&value=400

但是当我运行我的代码时,我从未通过Json转换,并且在调用GetQuestions()方法时没有任何内容返回给客户端。

我想在自定义c#对象中保存id,问题,答案和值,所以我创建了这个类:

public class JsonQuestion
{
    private DataContainer container;
    public int id { get; set; }
    public string answer { get; set; }
    public string question { get; set; }
    public int value { get; set; }
    public JsonQuestion(string categoryId, int value)
    {
        using (var webClient = new System.Net.WebClient())
        {
            var json = webClient.DownloadString("http://jservice.io/api/clues?category=" + categoryId + "&value=" + value);
            container = JsonConvert.DeserializeObject<DataContainer>(json);
        }
    }
    public DataContainer GetQuestions()
    {
        return container;
    }
}

这里我收到构造函数的categoryID和value,然后根据要反序列化的值创建URL。理想情况下,我想将容纳所有问题的容器返回给客户。 我上了一堂课,收到了所有问题:

public class DataContainer
{
    public List<JsonQuestion> Questions { get; set; }
}

我使用DeserializeObject调用。

1 个答案:

答案 0 :(得分:2)

首先你对json如何反序列化数组有错误的想法。如果您查看引入代码的异常,您将会遇到第一个错误:

  

附加信息:无法将当前JSON数组(例如[1,2,3])反序列化为“Application.Program + DataContainer”类型,因为该类型需要JSON对象(例如{“name”:“value”})正确地反序列化。

     

要修复此错误,请将JSON更改为JSON对象(例如{“name”:“value”})或将反序列化类型更改为数组或实现集合接口的类型(例如ICollection,IList)可以从JSON数组反序列化的列表。 JsonArrayAttribute也可以添加到类型中,以强制它从JSON数组反序列化。

你要做的是将数组反序列化为对象,这是不可能的。所以你需要像这样的json结构:{“问题”:[你的json的内容]}。为避免这种情况,您必须将反序列化更改为:

JsonConvert.DeserializeObject<List<JsonQuestion>>(json);

第二次,JsonConvert将采用最简单的构造函数,并将尝试使用它来创建嵌套的结构,你有多个。因此,每次必须调用构造函数时,JsonConvert将使用public JsonQuestion(string categoryId, int value)以及null和400的值(这些值从嵌套项中获取,其参数值设置为400且没有参数categoryId)。因此,每次下载新的json文档时,您都将陷入recuring循环。你要做的是提供JsonQuestion的公共默认构造函数。

整个代码看起来像这样:

    public class JsonQuestion
    {
        private List<JsonQuestion> container;
        public int id { get; set; }
        public string answer { get; set; }
        public string question { get; set; }
        public int value { get; set; }
        public JsonQuestion()
        {

        }
        public JsonQuestion(string categoryId, int value)
        {
            using (var webClient = new System.Net.WebClient())
            {
                var json = webClient.DownloadString("http://jservice.io/api/clues?category=" + categoryId + "&value=" + value);
                var container = JsonConvert.DeserializeObject<List<JsonQuestion>>(json);
            }
        }
        public DataContainer GetQuestions()
        {
            return new DataContainer
            {
                Questions = container,
            };
        }
    }

    public class DataContainer
    {
        public List<JsonQuestion> Questions { get; set; }
    }