使用Newtonsoft c#读取Json字符串

本文关键字:Json 字符串 读取 Newtonsoft 使用 | 更新日期: 2023-09-27 17:51:20

我不能用c#读取json字符串。读取

时出现错误Json文件
{
    "Invoice": {
        "Description": "New",
        "InvoiceTypeId": "3d166468-3923-11e6-9e7c-40e230cfb8ae",
        "CustomerAccountsId": "TEST",
        "InvoiceDate": "2016-06-27",
        "PayableDate": "2016-06-27",
        "Prefix": "A",
        "Serial": "34222",
        "tag": "TEST"
    },
    "InvoiceLine": [
        {
            "ValueId": "c41d3d85-3a1e-11e6-9e7c-40e230cfb8ae",
            "Qantity": "3",
            "UnitId": "a72e0dde-3953-11e6-9e7c-40e230cfb8ae",
            "Price": "1.500,00",
            "VatRateId": "18",
            "LineVat": "810,00",
            "LineTotal": "5.310,00",
            "Vat": "00a239f1-3c3a-11e6-9e7c-40e230cfb8ae"
        },
        {
            "ValueId": "fd11b236-3952-11e6-9e7c-40e230cfb8ae",
            "Qantity": "5",
            "UnitId": "a72e0dde-3953-11e6-9e7c-40e230cfb8ae",
            "Price": "1.000,00",
            "VatRateId": "18",
            "LineVat": "900,00",
            "LineTotal": "5.900,00",
            "Vat": "00a239f1-3c3a-11e6-9e7c-40e230cfb8ae"
        }
    ]
}

"从JsonReader读取JArray出错。"当前JsonReader项目不是一个数组:StartObject。路径",行1,位置1。"

JArray jsonVal = JArray.Parse(jsonArr) as JArray;
dynamic vars = jsonVal;

但是一切正常,我没有看到bug

使用Newtonsoft c#读取Json字符串

不要这样做…当你解析一个数组时,它显然是一个复杂的对象。

使用诸如Visual Studio或json2csharp.com之类的转换器来创建适当的目标对象结构:

public class Invoice
{
    public string Description { get; set; }
    public string InvoiceTypeId { get; set; }
    public string CustomerAccountsId { get; set; }
    public string InvoiceDate { get; set; }
    public string PayableDate { get; set; }
    public string Prefix { get; set; }
    public string Serial { get; set; }
    public string tag { get; set; }
}
public class InvoiceLine
{
    public string ValueId { get; set; }
    public string Qantity { get; set; }
    public string UnitId { get; set; }
    public string Price { get; set; }
    public string VatRateId { get; set; }
    public string LineVat { get; set; }
    public string LineTotal { get; set; }
    public string Vat { get; set; }
}
public class Invoices
{
    public Invoice Invoice { get; set; }
    public List<InvoiceLine> InvoiceLine { get; set; }
}

然后直接使用JsonConvert方法进行反序列化。

var parsedJson = JsonConvert.DeserializeObject<Invoices>(json);

还可以将其反序列化为动态对象。当然,这不是理想的,但如果你不想为它创建一个全新的类型,这是可行的

var vars =JsonConvert.DeserializeObject<dynamic>(  jsonArr);
//vars.InvoiceLine

我注意到在你的问题和评论中,"我如何阅读这个?"你可能也会在阅读JSON时感到困惑,这使得错误信息让你感到困惑。

你试图解析对象作为一个JArray,而你的JSON不是一个数组。

如果你看你的错误信息,

"从JsonReader读取JArray出错。"当前JsonReader项目不是一个数组:StartObject。路径",行1,位置1。"

它会立即在JSON的第一行的第一个字符抛出一个错误,并告诉你它不是一个数组。

{是JSON的第一个字符,它是一个数组,应该以[开始,就像你在写JavaScript一样。

数组:

var javaScriptArray = ["This", "Is", "An", "Array"];
对象:

var javaScriptObject = { id: 0, thisIsAnArray: false };

并把它们放在一起:

var javaScriptArrayOfObjects = [ { id: 0, thisIsAnArray: false},{ id: 1, thisIsAnArray: false} ];

你可以看到,当你看你的JSON (Java Script Object Notation)时,你应该能够分辨它是一个对象数组还是一个带有数组的对象。

这应该指出它是一个复杂的对象,而不是一个数组,David L的回答完美地涵盖了这一点。

我只是想更好地理解错误信息。