我想显示从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文件中,只是我没有在此处正确复制。
提前谢谢!
答案 0 :(得分:0)
首先:您的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;
}
答案 1 :(得分: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();
答案 2 :(得分:0)
首先,您需要验证JSON。
我使用此网站进行了验证,从而给出了关于您问题所在的相当不错的错误消息
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,建议使用此网站
这会将所有有效的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()
答案 3 :(得分:0)
首先,您的json格式不正确,至少在问题上,我无法编辑它,因为它仅在第21行缺少",
。
现在要解决您的问题,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());
答案 4 :(得分:0)
NewtonSoft期望它在json中发现的第一件事是一个数组,而不是单个对象。
期望如下:
[ <-- ARRAY STARTS
{"a":"a"},
{"a":"b"}
]
如果您的json总是看起来像您发布的内容,并且实际上只是要分解为数据表的一小部分,则需要先将其挖掘出来
或者,您可以使用诸如quicktype.io之类的服务来创建代表您的json的类集,因此您可以将其解析为这些类,并将其用作数据源