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

33

在试图向JArray添加一个类型为Class的对象时,我遇到了以下错误:

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

这是我的代码:

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(类)转换为JSON对象以被系统识别?

非常感谢您的回答。

谢谢。


1
为什么“_JArray”是动态的?你似乎总是将其分配给一个“JArray”,那么为什么不将其声明为“JArray”呢? - D Stanley
嗨@DStanley,我将_JArray从dynamic更改为JArray后,错误仍然存在。 - Reinhardt
1个回答

63

如果要将任意非原始 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 <= amounts.Length,这会导致IndexOutOfRangeException异常。)

.Net fiddle工作示例#1在此

或者,您可以使用LINQ和JArray.FromObject()简化代码,通过将字符串数组投影到一个AmountModel可枚举对象,然后将整个序列序列化为一个JArray

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

这里是示例fiddle #2的链接


谢谢@dbc。现在它运行得很好,也感谢您对循环迭代的更正。 :D - Reinhardt
@dbc 经过漫长而艰苦的努力,你的LINQ表达式极大地帮助了我。谢谢。 - jon.r
因为我很开心,而且你知道。 - Nico Zimmer
JArray(params object[] content)构造函数的目的是什么? - kofifus
1
@kofifus - 从参考源代码来看,它只调用了new JArray(object)构造函数。content可以包含JToken对象或可转换为JValue的基本对象,例如stringint,以及这些对象的集合。即new JArray("hello", "there")。但是,LINQ to JSON不会为非基本类型调用序列化器,您必须自己完成。 - dbc
运作得非常顺利 :) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接