1

我想将JSON文件中的数据显示到gridview. 我设法解码了JSON文件,并试图与gridview.

但是,会弹出一个错误。

错误是:Newtonsoft.Json.JsonSerializationException:'读取 DataTable 时出现意外的 JSON 令牌。预期 StartArray,得到 StartObject。路径'',第 1 行,位置 1

JSON代码:

{
 "value":{

"Status": 2,
    "AffectedSegments": [
      {

        "Line": "NEL",
        "Direction": "HarbourFront",
        "Stations": "NE9,NE8,NE7,NE6", 
      "MRTShuttleDirection": "HarbourFront"}
      ,
      {
        "Line": "EWL",
        "Direction": "Simei", 
     "Stations": "NE9,NE8,NE7,NE6", 
    "MRTShuttleDirection": "HarbourFront"}],
    "Message": [
      {
        "Content": "0901hrs : NEL "
        "CreatedDate": "2018-03-16 09:01:53"
      }
    ]
  }
}

编码:

    public DataTable jsonDataDiplay()
    {
        StreamReader sr = new StreamReader(Server.MapPath("TrainServiceAlerts.json"));
        string json = sr.ReadToEnd();
        var table = JsonConvert.DeserializeObject<DataTable>(json);
        //DataSet ds = JsonConvert.DeserializeObject<Wrapper>(json).DataSet;
        return table;
    }

设计页面:

 <asp:GridView ID="GridView2" runat="server">
     <Columns>
         <asp:BoundField DataField="Line" HeaderText="Line" />
         <asp:BoundField DataField="Direction" HeaderText="Direction" />
          <asp:BoundField DataField="Stations" HeaderText="Stations" />
          <asp:BoundField DataField="MRTShuttleDirection" HeaderText="MRTShuttleDirection" />


     </Columns>
 </asp:GridView>

我不确定如何解决该错误。请帮助我并给我建议!我在 NE 之外添加了“。它从一开始就在我的 json 文件中,只是我没有正确复制到这里。

先感谢您!

4

5 回答 5

2

首先:您的 JSON 示例无效:

"Message": [
  {
    "Content": "0901hrs : NEL  <- ", is missing 
    "CreatedDate": "2018-03-16 09:01:53"
  }
]

下一个问题是您不能将 json 直接反序列化为数据表。您的数据位于层次结构的深处,因此您必须做更多的工作来转换它:

public DataTable jsonDataDiplay()
{
    StreamReader sr = new StreamReader(Server.MapPath("TrainServiceAlerts.json"));
    string json = sr.ReadToEnd();
    dynamic table = JsonConvert.DeserializeObject(json);
    DataTable newTable = new DataTable();
    newTable.Columns.Add("Line", typeof(string));
    newTable.Columns.Add("Direction", typeof(string));
    newTable.Columns.Add("Stations", typeof(string));
    newTable.Columns.Add("MRTShuttleDirection", typeof(string));

    foreach (var row in table.value.AffectedSegments)
    {
        newTable.Rows.Add(row.Line, row.Direction, row.Stations, row.MRTShuttleDirection);
    }
    return newTable;
}
于 2018-10-16T08:09:37.710 回答
0

这是我认为您需要的示例代码。

        //Random json string, No fix number of columns or rows and no fix column name.   
        string myDynamicJSON = "[{'Member ID':'00012','First Name':'Vicki','Last Name':'Jordan','Registered Email':'vicki.j @tacinc.com.au','Mobile':'03 6332 3800','MailSuburb':'','MailState':'','MailPostcode':'','Engagement':'attended an APNA event in the past and ventured onto our online education portal APNA Online Learning','Group':'Non-member'},{'Member ID':'15072','First Name':'Vicki','Last Name':'Jordan','Registered Email':'vicki.j @tacinc.com.au','Mobile':'03 6332 3800','MailSuburb':'','MailState':'','MailPostcode':'','Engagement':'attended an APNA event in the past and ventured onto our online education portal APNA Online Learning','Group':'Non-member'}]";  

        //Using dynamic keyword with JsonConvert.DeserializeObject, here you need to import Newtonsoft.Json  
        dynamic myObject = JsonConvert.DeserializeObject(myDynamicJSON);  

        //Binding gridview from dynamic object   
        grdJSON2Grid.DataSource = myObject;  
        grdJSON2Grid.DataBind();  

        //Using DataTable with JsonConvert.DeserializeObject, here you need to import using System.Data;  
        DataTable myObjectDT = JsonConvert.DeserializeObject<DataTable>(myDynamicJSON);  

        //Binding gridview from dynamic object   
        grdJSON2Grid2.DataSource = myObjectDT;  
        grdJSON2Grid2.DataBind();  
于 2018-10-16T08:09:57.870 回答
0

首先,您需要验证您的 JSON。

我用这个网站来验证它,它给出了一个相当不错的错误信息,说明你的问题在哪里

https://jsonlint.com/

Error: Parse error on line 20:
...": [{            "Content": "0901hrs : NEL           "
----------------------^
Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '[', got 'undefined'

这应该是您解决此问题的起点。

我使用了验证器和一些研究,发现您的问题如下

        "Content": "0901hrs: NEL",

        "CreatedDate": "2018-03-16 09:01:53"

您的 json 似乎格式不正确”,添加了这个排序验证。

从那里我还建议在 c# 中使用对象来读取这个文件

创建这些对象 id 建议使用此站点

http://json2csharp.com/

这会将任何工作的 json 转换为 c# 对象,然后您可以将其读入

解决问题后,这就是您拥有对象后的外观

public class AffectedSegment
{
    public string Line { get; set; }
    public string Direction { get; set; }
    public string Stations { get; set; }
    public string MRTShuttleDirection { get; set; }
}

public class Message
{
    public string Content { get; set; }
    public string CreatedDate { get; set; }
}

public class Value
{
    public int Status { get; set; }
    public List<AffectedSegment> AffectedSegments { get; set; }
    public List<Message> Message { get; set; }
}

public class RootObject
{
    public Value value { get; set; }
}

从这里你应该能够将 json 读入 rootobject

 StreamReader sr = new StreamReader(Server.MapPath("TrainServiceAlerts.json"));
        string json = sr.ReadToEnd();
        var table = JsonConvert.DeserializeObject<RootObject>(json);

然后将项目绑定到网格只需执行此操作

MyGridView.DataSource = RootObject
MyGridView.DataBind()
于 2018-10-16T08:10:05.407 回答
0

首先,您的 json 格式不正确,至少在问题中,我无法编辑它,因为它仅",在第 21 行缺少 a。现在要解决您的问题,DeserializeObject<>()不能咀嚼您扔给它的所有东西,大多数有时您会创建一个独立的类并将其作为类型传递,但在您的用例中,我可以告诉您您想要显示第一个数组,以便您可以通过以下方式获取它:

var jsonLinq = JObject.Parse(json);
        // Find the first array using Linq
        var srcArray = jsonLinq.Descendants().Where(d => d is JArray).First();
        var trgArray = new JArray();
        foreach (JObject row in srcArray.Children<JObject>())
        {
            var cleanRow = new JObject();
            foreach (JProperty column in row.Properties())
            {
                // Only include JValue types
                if (column.Value is JValue)
                {
                    cleanRow.Add(column.Name, column.Value);
                }
            }
            trgArray.Add(cleanRow);
        }
        return JsonConvert.DeserializeObject<DataTable>(trgArray.ToString());
于 2018-10-16T08:10:42.170 回答
0

NewtonSoft 期望它在 json 中找到的第一件事是一个数组,而不是单个对象。

期待类似的东西:

  [ <-- ARRAY STARTS
    {"a":"a"},
    {"a":"b"}
  ]

如果您的 json 总是看起来像您发布的内容,并且实际上只是您想要分解为数据表的一小部分,那么您需要先将其挖掘出来

或者,您可以使用诸如 quicktype.io 之类的服务来创建一组代表您的 json 的类,这样您就可以将其解析为这些类,并将其用作您的数据源

于 2018-10-16T08:11:03.743 回答