2016-09-17 2 views
1

Я хочу получить данные из базы данных SQL Server с помощью C#. Я пытаюсь получить строку 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"]); здесь я получаю значение новое. вместо нового я хочу как «новый» –

+0

Да, если ваше свойство value является строкой, вам также нужно добавить кавычки, поэтому используйте 'sb.AppendFormat (" \ "{0} \" ", reader [" TITTLE "]); 'Но опять же, я настоятельно рекомендую вам использовать библиотеку для создания json. Что, если, например, один из ваших значений TITTLE содержит цитату '' '. Вам также придется позаботиться об этом, иначе он сломает вас jsonstring. – derpirscher

Смежные вопросы