【问题标题】:Unable To Find A Constructor无法找到构造函数
【发布时间】:2019-04-15 15:14:40
【问题描述】:

ScreenShot Of Error 我有一个包含一些数据的 json 文件,我想解析它,但每次我想反序列化对象时,它都会给我这个错误“找不到构造函数。一个类应该有一个默认构造函数,一个带有参数的构造函数或一个带有 json 构造函数的构造函数我不知道该怎么做,因为在我第一次使用 json 之前我没有使用 json。 这是我的 json :

{
   "Addition":
   {
       "Easy": [

                "New York Bulls",
                "Los Angeles Kings",
                "Golden State Warriros",
                "Huston Rocket"
            ],
      "Medium":[
                "New York Bulls",
                "Los Angeles Kings",
                "Golden State Warriros",
                "Huston Rocket"
      ],
       "Difficult": [
               "New York Bulls",
               "Los Angeles Kings",
               "Golden State Warriros",
               "Huston Rocket"
      ] 
   }
}

这是我的模型类

public class Addition
{

     public List<string> Easy { get; set; }
        public List<string> Medium { get; set; }
        public List<string> Difficult { get; set; }

    public Addition() { }

}

这是我的反序列化对象函数

private void ReadJson()
    {
        var assembly = typeof(WordProblemsScreen).GetTypeInfo().Assembly;
        Stream stream = 
assembly.GetManifestResourceStream("MathRandomizer.demo.json");

        using (var reader = new System.IO.StreamReader(stream))
        {

            string json = reader.ReadToEnd();

            JObject jObject = JObject.Parse(json);
            JToken jUser = jObject["Addition"];


            var addition = JsonConvert.DeserializeObject<Addition>(json);




        }
    }

【问题讨论】:

  • 我认为你甚至不需要这个构造函数,而是可以依赖默认构造函数。 JsonConvert 将使用它,如果没有提供其他的,并适当地设置属性。
  • @HimBromBeere 我已经尝试过你所说的,但错误仍然是一样的
  • @HimBromBeere 还是同样的错误
  • 我想你还有一个Addition 类。单击&lt;Addition&gt; 的中间,然后按[F12]。看看会带你去哪里。
  • var addition = JsonConvert.DeserializeObject&lt;Addition&gt;(json);

标签: c# json xamarin.forms json.net


【解决方案1】:

使用 Edit - Paste Special - Paste JSON as C# 将您的 Json 粘贴为 C# 或使用在线 JSON 到 C# 转换器之一,您将看到问题:

public class Addition
{
    public List<string> Easy { get; set; }
    public List<string> Medium { get; set; }
    public List<string> Difficult { get; set; }
}

public class RootObject
{ 
   public Addition Addition { get; set; }
}

【讨论】:

  • @Masti 反序列化为 RootObject。
【解决方案2】:

你需要一个根对象:

public class RootObject
{
    public Addition Addition { get; set; }
}

var result = JsonConvert.DeserializeObject<RootObject>(json);
Console.WriteLine(result.Addition.Easy.First());

Try it online

甚至works 使用带有[JsonConstructor] 属性的旧代码。

简单地说:您的 C# 类必须与您希望反序列化的 JSON 匹配。

假设您有以下 JSON:

{
    "person": {
        "name": "John"
    }
}

不能简单地将其反序列化为以下类:

public class Person
{
    public string Name { get; set; }
}

为什么?因为“人”对象不是您的根对象。上面序列化为 JSON 的类看起来像这样:

{
    "name": "John"
}

所以要反序列化上面的第一个示例,我们需要一个根对象:

public class RootObject
{
    public Person Person { get; set; }
}

public class Person
{
    public string Name { get; set; }
}

现在我们可以将 JSON(包含“person”键的那个)反序列化为RootObject

JSON 非常简单 - 只需匹配即可。

【讨论】:

  • 我得到了同样的错误这就是我所做的我做了一个新的类名 RootObject 并将上面的代码放在那个类中然后我把最后一行放在我的 readjson 函数中但仍然是同样的错误
  • 好的,为什么我们没有得到两个示例小提琴中的错误?你正在做一些不同的事情。
  • 我有一个单独的 json 文件,我想从中读取值,但您正在课堂上编写 json
  • 我复制并粘贴了相同的代码,但仍然出现相同的错误
  • 谢谢我通过进入 android 选项并仅更改链接到 sdk 程序集来解决它
【解决方案3】:

发生异常是因为您尝试将 JSON 内容转换为错误的对象。由于您的 JSON 在顶部包含属性“Addition”,因此它被视为某些父类的属性。所以它需要这样的类:

namespace JsonStuff
{
    public class SomeParentClass
    {
        public Addition AdditionObject { get; set; }

        public SomeParentClass()
        {

        }
    }
}

如果您尝试以另一种方式从类型“Addition”序列化对象并查看输出的 json 字符串,您会发现不同:

var filledObject = new Addition()
{
    Easy = new List<string>()
    {
        "New York Bulls",
        "Los Angeles Kings",
        "Golden State Warriros",
        "Huston Rocket"
    },
    Medium = new List<string>()
    {
        "New York Bulls",
        "Los Angeles Kings",
        "Golden State Warriros",
        "Huston Rocket"
    },
    Difficult = new List<string>()
    {
        "New York Bulls",
        "Los Angeles Kings",
        "Golden State Warriros",
        "Huston Rocket"
    }
};

var serializedObject = JsonConvert.SerializeObject(filledObject);

结果将是:

{
    "Easy":
    [
        "New York Bulls",
        "Los Angeles Kings",
        "Golden State Warriros",
        "Huston Rocket"
    ],
    "Medium":
    [
        "New York Bulls",
        "Los Angeles Kings",
        "Golden State Warriros",
        "Huston Rocket"
    ],
    "Difficult":
    [
        "New York Bulls",
        "Los Angeles Kings",
        "Golden State Warriros",
        "Huston Rocket"
    ]
}

您会看到不同之处:顶部没有“加法”属性。

【讨论】:

  • 您可以像我在顶部发布的那样创建一个父类,也可以将您的 json 文件更改为底部示例的格式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-15
  • 2022-08-15
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 2020-09-05
  • 2020-12-17
相关资源
最近更新 更多