2016-06-27 54 views
1

我无法用c#读取json字符串。我在阅读时遇到错误。用Newtonsoft 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电流JsonReader项读取JArray不是数组:。在StartObject路径 '',第1行,位置1”。

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

但是一切正常,我没有看到错误。

+4

你试图反序列化一个不是数组的数组的json字符串。 –

+0

我怎么读这个? – caras

+0

创建您自己的类来反序列化此JSON字符串。 –

回答

4

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

使用的转换器,例如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); 
+3

提及http://json2csharp.com的互联网点 - 我发誓,因为它保存了我的培根公平几次:) –

1

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

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

我的问题,发现和自己的留言,“做我怎么读呢? “您也可能会在阅读JSON时感到困惑,因为这会使您的错误信息混淆不清。

您正尝试将对象解析为JArray,而JSON不适用于数组。

如果你看看你的错误信息,

“错误从JsonReader当前JsonReader项读书JArray不是数组:。在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脚本对象符号)你应该能够判断它是一个对象数组还是对象数组与数组。

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

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

+0

是的,你是正确的。谢谢 – caras