【问题标题】:Unable to cast object of type 'System.Object[]' to type my class C#无法将“System.Object []”类型的对象转换为我的类 C#
【发布时间】:2019-06-21 03:18:54
【问题描述】:

我正在从我的一个 API 获取数据以进行语言转换

这是我的查询

var jsonResponse = response.Content.ReadAsStringAsync().Result;

以下是我的示例数据

[{"detectedLanguage":{"language":"en","score":1.0},"translations":[{"text":"All","to":"en"},{"text":"सभी","to":"hi"}]}]

现在我想转换 List 中的数据

所以我根据我的数据创建了一些类

    public class translations
    {
        public string text { get; set; }
        public string to { get; set; }
    }

    public class detectedLanguage
    {
        public string language { get; set; }
        public float score { get; set; }
    }

    public class TranslatedString
    {
        public List<detectedLanguage> detectedLanguage { get; set; }
        public List<translations> translations { get; set; }
    }

并使用newtonsoft.Json 将此数据转换为如下列表

JavaScriptSerializer json_serializer = new JavaScriptSerializer();
TranslatedString routes_list = (TranslatedString)json_serializer.DeserializeObject(jsonResponse);

但我收到如下错误

Unable to cast object of type 'System.Object[]' to type 'Avalon.TranslatedString'.

可以做些什么来解决这个问题?

【问题讨论】:

  • 你根本没有使用json.net,你使用的是javascriptserializer。你的意思是使用哪个?
  • detectedLanguage 可以不止一个吗?
  • 不会有

标签: c# asp.net-web-api json.net


【解决方案1】:

您可以使用此网站从 JSON 生成类 - Here

在您的情况下,课程将是 -

public class DetectedLanguage
{
    public string language { get; set; }
    public double score { get; set; }
}

public class Translation
{
    public string text { get; set; }
    public string to { get; set; }
}

public class RootObject
{
    public DetectedLanguage detectedLanguage { get; set; }
    public List<Translation> translations { get; set; }
}

反序列化的代码将是 -

var data = JsonConvert.DeserializeObject<List<RootObject>>(jsonString);

【讨论】:

  • 我在替换您的代码时收到此错误,无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型“Avalon.RootObject”,因为该类型需要 JSON 对象(例如 {"name":"value"}) 以正确反序列化。要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为数组或实现集合接口的类型(例如 ICollection、IList),例如 List 可以从 JSON 数组反序列化。 JsonArrayAttribute 也可以添加到类型中以强制它从 JSON 数组反序列化。第 1 行,位置 1。
【解决方案2】:

首先,您不应该在任何正常意义上这样做ReadAsStringAsync().Result;。您正在混合async 和同步代码。

其次,您的 json 与以下内容不匹配

"detectedLanguage":{  
     "language":"en",
     "score":1.0
 },

public List<detectedLanguage> detectedLanguage { get; set; }

应该是

public detectedLanguage detectedLanguage { get; set; }

这是一个 json 对象而不是一个列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    相关资源
    最近更新 更多