pbj
pbj

Reputation: 719

Import json data using c#

Form a third party system deserialize json data to the object/class format and write data into a SQL Server table from a asp.net web api. When I run the below code I run into the following error

cannot convert json collection to string

I am using System.Web.Extensions dll to deserialize json data.

JSON:

{
   "data":[
      {
         "Id":"1",
         "Student":"T code",
         "Grade":"Test code"
      }
   ],
   "Token":"",
   "header":[
      "Id",
      "Student",
      "Grade"
   ],
   "Rowcount":1
}

My model:

public class Student
{
    public string Id { get; set; }
    public string Student { get; set; }
    public string Grade { get; set; }
}

public class AllStudents
{
    public IList<SData> data { get; set; }
}

My controller:

[HttpPost]
public IHttpActionResult Post(Student studentjson)
{
    IList<SData> StudentList = studentjson.data;
    var serializer = new JavaScriptSerializer();
    Student StudentObj = serializer.Deserialize<Student>(studentjson.data.ToString());

    string SQLConnectionString = ConfigurationManager.ConnectionStrings["SQLConnectionString"].ConnectionString;            
    using (SqlConnection conn = new SqlConnection(SQLConnectionString))
    {
        conn.Open();
        foreach (var student in StudentObj.data)
        {
            if (writetotbl(conn, student))
            {
                Console.WriteLine("Success : " + student.Student);
            }
            else
            {
                Console.WriteLine("Error : " + student.Student);
            }
        }
    }           
}

static bool writetotbl(SqlConnection conn, studentjson StudentObj)
{
    try
    {
        string query = @"INSERT INTO [dbo].[student] ([student]) VALUES (@student)";
        using (SqlCommand cmd = new SqlCommand(query, conn))
        {
            cmd.Parameters.Add(new SqlParameter("@student", StudentObj.student));
            cmd.ExecuteNonQuery();
        }
        return true;
    }
    catch (Exception ex)
    {
        return false;
    }
}

Upvotes: 3

Views: 2101

Answers (1)

levent
levent

Reputation: 3634

your model classes should be like this.

public class Student
{
    public string Id { get; set; }
    public string Student { get; set; }
    public string Grade { get; set; }
}

public class RequestModel
{
    public List<Student> data { get; set; }
    public string Token { get; set; }
    public List<string> header { get; set; }
    public int Rowcount { get; set; }
}

you do not need an extra serializer on web api. asp.net web api supports json-xml media types by default.

    [HttpPost]
    public IHttpActionResult Post(RequestModel studentjson)
    {
        string SQLConnectionString = ConfigurationManager.ConnectionStrings["SQLConnectionString"].ConnectionString;
        using (SqlConnection conn = new SqlConnection(SQLConnectionString))
        {
            conn.Open();
            try
            {
                foreach (var student in studentjson.data)
                {
                    if (writetotbl(conn, student.Student))
                    {
                        Console.WriteLine(string.Format("Id:{0}, Student:{1}, Grade:{2}", student.Id, student.Student, student.Grade));
                    }
                    else
                    {
                        Console.WriteLine("Error : " + student.Student);
                    }
                }
                conn.Close();
            }
            catch (Exception ex)
            {
                // make sure the connection is closed
                if (conn.State != System.Data.ConnectionState.Closed)
                    conn.Close();
                throw;
            }
        }
    }

Upvotes: 3

Related Questions