无法确定类型“类”的 JSON 对象类型

Posted

技术标签:

【中文标题】无法确定类型“类”的 JSON 对象类型【英文标题】:Could not determine JSON object type for type "Class" 【发布时间】:2015-01-18 09:40:38 【问题描述】:

尝试将类类型的对象添加到 JArray 时出现以下错误。

Could not determine JSON object type for type "Class"

这是我正在使用的代码:

private dynamic _JArray = null

private JArray NArray(Repository repository)
    
        _JArray = new JArray();

        string[] amounts = repository.Amounts.Split('|');

        for (int i = 0; i <= amounts.Length; i++)
        
            _JArray.Add(
                new AmountModel
                
                    Amounts = amounts[i],
                );
        

        return _JArray;
    

public class AmountModel

    public string Amounts;

我在运行程序时这样称呼它:

_JArray = NArray(repository);

Console.WriteLine(JsonConvert.SerializeObject(_JArray));

如何将_JArray (JArray)中的AmountModel (class)转换为JSON对象?

非常感谢您的回答。

谢谢。

【问题讨论】:

为什么_JArray 是动态的?您似乎分配给它的只是JArray,那么为什么不将其声明为JArray 嗨@DStanley,在我将_JArray 从动态更改为JArray 后,错误仍然存​​在 【参考方案1】:

要将任意非原始 POCO 添加到 JArray(或 JObject),您必须使用 JToken.FromObject() 的重载之一显式序列化它:

_JArray = new JArray();

string[] amounts = repository.Amounts.Split('|');

for (int i = 0; i < amounts.Length; i++)

    _JArray.Add(JToken.FromObject(
        new AmountModel
        
            Amounts = amounts[i],
        ));


return _JArray;

(另请注意,我更正了您的for 循环中的结束条件。它是i &lt;= amounts.Length,导致IndexOutOfRangeException 异常。)

工作示例 .Net fiddle #1 here。

或者,您可以使用 LINQ 和 JArray.FromObject() 简化代码,方法是将字符串数组投影到 AmountModel 枚举,然后在一次调用中将整个序列序列化为 JArray

var _JArray = JArray.FromObject(amounts.Select(a => new AmountModel  Amounts = a ));

小提琴样本 #2 here.

【讨论】:

谢谢@dbc。它现在工作正常,也感谢循环迭代的更正。 :D @dbc 很多很多小时都在努力解决这个问题——你的 LINQ 表达式帮助很大。谢谢 因为我很开心,现在你也很开心 那么 JArrat 构造函数JArray(params object[] content) 的目的是什么? @kofifus - 从reference source 它只调用new JArray(object) 构造函数。 content 可以包含JToken 对象或可转换为JValue 的原始对象,例如stringint,以及此类的集合。 IE。 new JArray("hello", "there")。但是 LINQ to JSON 不会为非原始类型调用 serializer,您必须自己执行此操作。

以上是关于无法确定类型“类”的 JSON 对象类型的主要内容,如果未能解决你的问题,请参考以下文章

httpClient.GetAsync电话扔System.ArgumentException:无法确定JSON对象类型

C ++从两个类中确定void *的类型

Effective Objective-C 2.0 — 第14条:理解“类对象“的用意

无法将类型'Newtonsoft.Json.Linq.JObject'的对象转换为类型

无法将“Newtonsoft.Json.Linq.JArray”类型的对象转换为“System.Collections.Generic.List”类型

无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型“ConsoleAppTest01.Location”,因为该类型需要 JSON 对象