Как привязать данные JSON к gridview в asp.net c #? - PullRequest
0 голосов
/ 16 октября 2018

Я хотел отобразить данные из файла JSON в gridview.Мне удалось декодировать файл JSON, и я пытался связать его с gridview.

Однако появляется ошибка.

Ошибка: Newtonsoft.Json.JsonSerializationException: 'Неожиданный токен JSON при чтении DataTable.Ожидаемый 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, просто я не правильно скопировал здесь.

Заранее спасибо!

Ответы [ 5 ]

0 голосов
/ 16 октября 2018

NewtonSoft ожидал, что первым, что он найдет в json, будет массив, а не один объект.

Ожидается что-то вроде:

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

Если ваш json всегда будет выглядеть так, как вы написали, и это всего лишь небольшая его часть, которую вы хотите разбить на данныесначала вам нужно это выяснить

В качестве альтернативы вы можете использовать какой-то сервис, такой как quicktype.io, для создания набора классов, представляющих ваш json, чтобы вы могли разобрать его в эти классы и использоватькак ваш источник данных

0 голосов
/ 16 октября 2018

Прежде всего, ваш 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());
0 голосов
/ 16 октября 2018

Это пример кода, который вам нужен, я думаю.

        //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();  
0 голосов
/ 16 октября 2018

Для начала вам нужно проверить ваш 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()
0 голосов
/ 16 октября 2018

Прежде всего: Ваш образец 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...