2016-09-17 131 views
1

我想从使用C#的SQL Server数据库获取数据。我正在尝试从字符串生成器中获取json字符串。我尝试这样的:将字符串生成器转换为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","}}] 

的意思是:我的主标题是新的子丝毫不差名new1和任务标题new2。我需要做些什么改变我的代码才能获得我所需的json字符串?

+0

在sb.Append中使用此语法(“”“main”“”); –

+0

你为什么建立你的JSON结果为字符串? –

+0

我想更新它在我的页面表使用循环,因为我需要JSON格式输出 –

回答

0

有一些问题与您的代码:

要成为一个有效的JSON字符串,属性名必须用双引号"被封闭,所以你必须做一些像sb.Append("\"main\"");

每个属性名称有后跟一个冒号:,所以你必须做点像sb.Append("\"main\": ");

你正在处理嵌套结构,包含对象的数组本身包含数组...你只能添加右括号所有项目都添加后,数组的。所以这样做

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

为了能够做到这一点,你必须保持跟踪你有什么结构,在当下开放,你有你自己的查询到所需的确切顺序返回行(即首先是主标题,然后是第一个包含子,然后是包含在该子任务中的任务,然后是第二个子任务,然后是任务...)

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

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

+0

坦克.......... –

+0

和更多的疑问。我想夸脱(“”)的列值。 sb.AppendFormat(“{0}”,reader [“TITTLE”]);在这里我获得了一个新的价值。如果你的属性值是一个字符串,你还必须添加引号,所以使用'sb.AppendFormat(“\”{0} \“”,reader [“TITTLE”]);而不是新的我想要“新” –

+0

。 '但是,我强烈建议你使用库来创建json。例如,如果你的TITTLE值中有一个包含引号''',那么你也必须照顾它,否则它会打断你的jsonstring。 – derpirscher