1

I've create a .NET web service with JSON. but the result didn't show as array. how to make the JSON result into array in my web service?

here is my web service code:

[WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public String GetReport()
    {
        ModelReport.Report report = new ModelReport.Report();
        string connectionString = ConfigurationManager.ConnectionStrings["ConnWf"].ConnectionString;
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            string sql = "select type, sum(OrderQty) as total from tbl_weeklyflash_ID where type <> 'NULL' group by type";
            connection.Open();

            SqlCommand command = new SqlCommand(sql, connection);
            SqlDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
                report.type = reader["type"].ToString();
                report.total = reader["total"].ToString();
            }
        }

        MemoryStream stream = new MemoryStream();
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(ModelReport.Report));
        serializer.WriteObject(stream, report);
        stream.Position = 0;
        StreamReader streamReader = new StreamReader(stream);
        return streamReader.ReadToEnd(); 
    }

1 Answer 1

1

You are serializing a single instance of the Report object, not an array. So the first step is to build an array:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public String GetReport()
{
    List<ModelReport.Report> reports = new List<ModelReport.Report>();
    string connectionString = ConfigurationManager.ConnectionStrings["ConnWf"].ConnectionString;
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        string sql = "select type, sum(OrderQty) as total from tbl_weeklyflash_ID where type <> 'NULL' group by type";
        connection.Open();

        SqlCommand command = new SqlCommand(sql, connection);
        SqlDataReader reader = command.ExecuteReader();
        while (reader.Read())
        {
            ModelReport.Report report = new ModelReport.Report();
            report.type = reader["type"].ToString();
            report.total = reader["total"].ToString();
            reports.Add(report);
        }
    }

    MemoryStream stream = new MemoryStream();
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(ModelReport.Report[]));
    serializer.WriteObject(stream, reports.ToArray());
    stream.Position = 0;
    StreamReader streamReader = new StreamReader(stream);
    return streamReader.ReadToEnd(); 
}

and the second step of course is to do this properly and get rid of any plumbing code in your method and leave this to the infrastructure:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public ModelReport.Report[] GetReport()
{
    List<ModelReport.Report> reports = new List<ModelReport.Report>();
    string connectionString = ConfigurationManager.ConnectionStrings["ConnWf"].ConnectionString;
    using (SqlConnection connection = new SqlConnection(connectionString))
    using (SqlCommand command = connection.CreateCommand)
    {
        string sql = "select type, sum(OrderQty) as total from tbl_weeklyflash_ID where type <> 'NULL' group by type";
        connection.Open();

        command.CommandText = sql;
        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                ModelReport.Report report = new ModelReport.Report();
                report.type = reader["type"].ToString();
                report.total = reader["total"].ToString();
                reports.Add(report);
            }
        }
    }

    return reports.ToArray();
}

You will also notice in my second example that the proper way to dispose IDisposable resources is to always wrap them in using statements.

Sign up to request clarification or add additional context in comments.

1 Comment

Now I get it, thank you very much for your explanation :) but, in your second example, the result didn't show as JSON variable and I want the result in JSON variable, so I use your first example. Thanks again @Darin

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.