无法确定类型“类”的 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 <= 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
的原始对象,例如string
或int
,以及此类的集合。 IE。 new JArray("hello", "there")
。但是 LINQ to JSON 不会为非原始类型调用 serializer,您必须自己执行此操作。以上是关于无法确定类型“类”的 JSON 对象类型的主要内容,如果未能解决你的问题,请参考以下文章
httpClient.GetAsync电话扔System.ArgumentException:无法确定JSON对象类型
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 对象