无法强制转换类型为';的对象;Newtonsoft.Json.Linq.JObject';键入';Ne

本文关键字:Json Newtonsoft Linq JObject Ne 键入 对象 类型 转换 | 更新日期: 2023-09-27 18:20:16

我正在测试我的Web API。模拟数据我有这个:

var objs = ((JArray)JsonConvert.DeserializeObject("{ '"PrintId'":10,'"Header'":'"header'",'"TC'":'"tc'",'"CompanyRef'":'"00000000-0000-0000-0000-000000000000'"}")).Values<JObject>();

这给了我一个错误:

无法将"Newtonsoft.Json.Linq.JObject"类型的对象强制转换为"Newtonsoft.Json.Linq.JArray"类型

问题是它一直在工作。我一定改变了什么,但我不知道是什么。

我的意图是将这个JSON对象转换为一个名为Print的.NET对象列表,其中包含以下字段:

PrintId
Header
TX
CompnayRef

无法强制转换类型为';的对象;Newtonsoft.Json.Linq.JObject';键入';Ne

只需创建一个类并对其进行反序列化即可。

public class Print
{
    public int PrintId { get; set; }
    public string Header { get; set; }
    public string TC { get; set; }
    public string CompanyRef { get; set; }
}
Print printObj = JsonConvert.DeserializeObject<Print>(yourJson);
printObj.PrintId = //...

正如消息所说,您的对象是JObject,所以不要将其强制转换为JArray。试试这个:

var objs = JsonConvert.DeserializeObject("{ '"PrintId'":10,'"Header'":'"header'",'"TC'":'"tc'",'"CompanyRef'":'"00000000-0000-0000-0000-000000000000'"}");

更新若要获得集合List<Print>,JSON需要是一个数组。试试这个(我把你的JSON做成了一个数组,并添加了第二个对象):

string json = "[{ '"PrintId'":10,'"Header'":'"header'",'"TC'":'"tc'",'"CompanyRef'":'"00000000-0000-0000-0000-000000000000'"}"
            + ",{ '"PrintId'":20,'"Header'":'"header2'",'"TC'":'"tc2'",'"CompanyRef'":'"00000000-0000-0000-0000-000000000000'"}]";
var objs = JsonConvert.DeserializeObject<List<Print>>(json);
//The loop is only for testing. Replace it with your code.
foreach(Print p in objs){
    Console.WriteLine("PrintId: " + p.PrintId);
    Console.WriteLine("Header: " + p.Header);
    Console.WriteLine("TC: " + p.TC);
    Console.WriteLine("CompanyRef: " + p.CompanyRef);
    Console.WriteLine("==============================");
}
public class Print
{
    public int PrintId { get; set; }
    public string Header { get; set; }
    public string TC { get; set; }
    public string CompanyRef { get; set; }
}

这是一把小提琴。

因为{}是一个jobject表示法,所以要使它成为jarray,只需在它周围放上方括号,例如[{}]。因此,在您的情况下,只需放入这两个字符就可以解决问题。

var objs = ((JArray)JsonConvert.DeserializeObject("[{ '"PrintId'":10,'"Header'":'"header'",'"TC'":'"tc'",'"CompanyRef'":'"00000000-0000-0000-0000-000000000000'"}]")).Values<JObject>();

你可以在这里试试https://dotnetfiddle.net/RmgGw8

注意:你以前说过它有效。所以这个字符串输入可能是序列化的结果。您以前没有遇到任何问题,因为在此之前,您的输入始终是一个包含多个项的数组。并且您的序列化程序可能正在为单个项数组生成单个对象(输出以"{"开头),而不是数组(输出以["开头)。

将单个对象序列化为JSON对象而非JSON数组的列表

对我来说,我把空字符串作为导致问题的对象,我切换到"{}",它修复了我的问题