将字符串生成器转换为json字符串

时间:2016-09-17 05:06:24

标签: c# jquery json

我想使用C#从SQL Server数据库获取数据。我试图从字符串生成器获取一个json字符串。我试着这样:

public string GetData()
{
    using (SqlConnection con = new SqlConnection(this.Connection))
    {
        con.Open();

        SqlCommand command = new SqlCommand("Select TITLE, DURATION, STATUS, TYPE from PROJECTS ", con);

        StringBuilder sb = new StringBuilder();
        sb.Append("{");

        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                var k = reader.GetString(3);

                if (k == "M")
                {
                    sb.Append("main");
                    sb.Append("{");
                    sb.Append("sub:[]");
                    sb.Append("Tittle:");
                    sb.AppendFormat("{0}", reader["TITTLE"]);
                }

                if (k == "S")
                {
                    sb.Append("sub");
                    sb.Append("{");
                    sb.Append("task:[]");
                    sb.Append("Tittle:");
                    sb.AppendFormat("{0}", reader["TITTLE"]);
                }

                if (k == "T")
                {
                    sb.Append("task");
                    sb.Append("{");
                    sb.Append("Tittle:");
                    sb.AppendFormat("{0}", reader["TITTLE"]);
                }
            };
        }

        sb.Append("}");
        sb.AppendLine();

        return sb.ToString();
    }
}

现在我得到了像

这样的字符串
sb = {{main{sub:[]Tittle:newsub{task:[]Tittle:new1task{Tittle:new2}

但我需要的字符串如下:

[{"main":{"sub":[{"task":[{"tittle":"new2""}],"tittle":"new1","}],"tittle":"new","}}]

表示:我的主标题是new和sub tittle new1,任务标题new2。我需要对代码进行哪些更改才能获得所需的json字符串?

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题:

要成为有效的JSON字符串,必须使用双引号"括起属性名称,因此您必须执行sb.Append("\"main\"");

之类的操作

每个属性名称后面都必须跟一个冒号:,因此您必须执行sb.Append("\"main\": ");

之类的操作

您正在处理嵌套结构,包含对象的数组,这些数组本身包含数组......在添加了所有项目之后,您只能添加数组的右括号]。所以做一些像

这样的事情
sb.Append("\"sub\": [");
//here you add the subitems in a loop
sb.Append("]");

为了能够这样做,您将必须跟踪您当前打开的结构,并且您将查询以确切的所需顺序返回行(即首先是主要标题,然后是第一个包含sub,然后是该子包含的任务,然后是第二个子,然后是任务......)

您也永远不会关闭更高级别的开放式大括号{。这同样适用于数组。如果添加对象,则必须添加其所有内容,然后添加结束}大括号。

通常,我建议不要自己创建JSON,而是使用像JSON.net这样的框架。您可以根据需要构建集合,然后调用框架序列化方法,该方法将生成有效的json字符串。