c# с использованием сериализатора JavaScriptSerializer при l oop и возврате на сторону клиента к Json .Parse. Получение ошибки - PullRequest
0 голосов
/ 20 марта 2020

Может ли кто-нибудь дать мне шаг, чтобы решить эту ошибку при получении вывода. Новое в кодировании.

Шаг 1 : Использование Json / Javascript для вызова метода из файла .cs (c#)

 var markers = JSON.parse('<%=ConvertDataTabletoString("NewGetTaskWorkPercentage1",null) %>');

Шаг 2 :

.cs file code for method ConvertDataTabletoString
 public string ConvertDataTabletoString(string Sql, string prjno)
        {
            //var qprojectno = Request.QueryString["ProjectNo"].ToString();
            param1.Value = "P-2020-0009";  //aspx hidden field
           DataTable dt = new DataTable();
            using (con = new SqlConnection(connectionString))
            {
                using (cmd = new SqlCommand(Sql, con))
                {
                    string connetionString = "Data Source = ; Initial Catalog = DashBoardDB; User ID = ; Password = ";
                    SqlConnection connection = new SqlConnection(connetionString);
                    connection.Open();
                     string sql1 = "SELECT InstanceId,Module,SubModule,Process FROM Xtable WHERE ProjectNo=" + "'" + param1.Value + "'"+ "and instanceid='aabed4df-3e91-41c0-8788-2e7d31eecfd8'";

                    SqlCommand command = new SqlCommand(sql1, connection);
                    command.CommandTimeout = 600;
                    SqlDataReader dataReader = command.ExecuteReader();
                  serializedResult = " ";
                    while (dataReader.Read())
                    {
                       string strInsId = " ";
                        string strProcess = "";
                      strInsId = dataReader["InstanceId"].ToString();
                       con.Open();
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Parameters.Clear();
                        cmd.Parameters.Add(new SqlParameter("@ProjectNo", prjno));
                        cmd.Parameters.Add(new SqlParameter("@InstanceId", strInsId));
                        sda = new SqlDataAdapter(cmd);
                        sda.Fill(dt);
System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
                        List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
                        Dictionary<string, object> row;

                        foreach (DataRow dr in dt.Rows)
                        {
                            Console.WriteLine(dr + " " + dt.Rows);
                            row = new Dictionary<string, object>();
                            foreach (DataColumn col in dt.Columns)
                            {
                                 row.Add(col.ColumnName, dr[col]); 
                            }
                            rows.Add(row);
                        }

                        serializedResult = serializer.Serialize(rows);
                        serializedResult += serializer.Serialize(rows); **two times concatenating**
                        con.Close();}
                       dataReader.Close();
                    command.Dispose();
                    connection.Close();
                    return serializedResult;
                   }
 }

        }

Шаг 3 : Прикрепленное изображение

enter image description here

enter image description here

enter image description here

На стороне клиента, как разбить эти значения на массивы. Я требовал вывода, как это. Как я могу получить вывод в массиве и длину массива на стороне клиента. Спасибо

Массив 1:

 [{"Task":"Feature 1.1.3","OverallSubtaskDuration":17.00,"ActualStart":"2019/10/18","ActualEnd":"2020/03/13","OverallSubtaskPercentage":283.33},
  {"Task":"Feature 1.1.3","OverallSubtaskDuration":8.00,"ActualStart":"2019/10/18","ActualEnd":"2019/10/25","OverallSubtaskPercentage":133.33},
  {"Task":"Feature 1.1.3","OverallSubtaskDuration":3.00,"ActualStart":"2020/03/11","ActualEnd":"2020/03/13","OverallSubtaskPercentage":50.00},
  {"Task":"Feature 1.1.3","OverallSubtaskDuration":3.00,"ActualStart":"2019/10/27","ActualEnd":"2019/10/29","OverallSubtaskPercentage":50.00}]

Массив 2:

[{"Task":"Feature 1.1.3","OverallSubtaskDuration":17.00,"ActualStart":"2019/10/18","ActualEnd":"2020/03/13","OverallSubtaskPercentage":283.33},
 {"Task":"Feature 1.1.3","OverallSubtaskDuration":8.00,"ActualStart":"2019/10/18","ActualEnd":"2019/10/25","OverallSubtaskPercentage":133.33},
 {"Task":"Feature 1.1.3","OverallSubtaskDuration":3.00,"ActualStart":"2020/03/11","ActualEnd":"2020/03/13","OverallSubtaskPercentage":50.00},
 {"Task":"Feature 1.1.3","OverallSubtaskDuration":3.00,"ActualStart":"2019/10/27","ActualEnd":"2019/10/29","OverallSubtaskPercentage":50.00}]

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Результат JSON должен быть либо объектом, либо массивом.

Результат, который вы создаете, состоит из двух массивов вплотную и поэтому недопустим JSON, и вы можете проверить это с помощью онлайновый валидатор, такой как https://jsonlint.com/

Так что вам нужно либо создать один большой массив со всеми элементами из обоих ваших других массивов, либо вам нужно обернуть эти два массива в объект-оболочку ,

Самое простое для вас, поскольку вы уже используете List <>, - это объединить это с самим собой и вернуть результат.

//Add the "rows" list to itself, so you double it.
rows.AddRange(rows);
serializedResult = serializer.Serialize(rows);
...
return serializedResult;

Если вам нужно сохранить списки различными тогда вы должны использовать объект-оболочку. Вот так;

public class Wrapper
{
    public List<Dictionary<string, object>> Array1 { get; set;  }
    public List<Dictionary<string, object>> Array2 { get; set; }
}

Затем вы сериализуетесь так

serializedResult = serializer.Serialize(new Wrapper() { Array1 = rows, Array2 = rows };);
...
return serializedResult;
0 голосов
/ 20 марта 2020

Вы можете использовать newtonsoft json dll для создания json файла из .cs и проверить json строку со ссылкой: https://jsoneditoronline.org/

...