2017-02-22 19 views
-1

Я пытаюсь преобразовать список в строку json. Json генерирует отлично, но когда я пытаюсь создать массив в JSON, он не будет правильно отформатировать.Включите список в JSON из массива

Мой список генерируется

List<string> invoicesList = new List<string>(); 

     foreach (var invoice in theInvoices) 
     { 
      invoicesList.Add(invoice.InvoiceNumber); 
      invoicesList.Add(String.Format("{0:c}", invoice.GrandTotal)); 
      invoicesList.Add(FieldTranslation.ToShortDate(invoice.Date.ToString())); 
     } 

Затем я добавляю его в формат JSON

var info = new MobileAPIHelper.ClientPayrollInfo 
     { 
      GrossWages = String.Format("{0:c}", GrossWages), 
      InvoiceTotal = String.Format("{0:c}", invoiceTotal), 
      InvoiceDate = FieldTranslation.ToShortDate(invoiceDate.ToString()), 
      InvoiceList = invoicesList.ToArray() 

     }; 

Выход заканчивается просто быть длинный JSON строку со всем из списка

"InvoiceList":["SALES000000000006","$9,300.00","4/11/2016","SALES000000000008","$4,650.00","12/22/2015"] 

Я не могу понять, как получить список/json для форматирования этого invoicelist следующим образом:

"InvoiceList":[{ 
"SALES000000000006","$9,300.00","4/11/2016" 
},{ 
"SALES000000000008","$4,650.00","12/22/2015" 
}] 
+0

Вы используете сериализатор, например. один из описанных в [этом ответе] (http://stackoverflow.com/q/6201529/3744182), или вы пытаетесь вручную создать JSON посредством форматирования строк? – dbc

+0

@dbc я просто 'возвращаю Json (info, JsonRequestBehavior.AllowGet);' – TheDizzle

+0

В этом случае я предлагаю вам развернуть свой вопрос в [mcve] и пометить его полностью ([tag: asp.net-mvc] или [ тег: asp.net-web-api] или что-то еще). – dbc

ответ

1

invoicesList - это не список объектов, содержащих эти значения, это список строк. Вам необходимо создать класс, который действует как контейнер для

invoice.InvoiceNumber; 
String.Format("{0:c}", invoice.GrandTotal); 
invoice.Date.ToString()); 

эти поля. Сделать invoicesList список этого класса, а затем разобрать его на json. Вы добавляете сырые строки.

1

Если вы сделаете эту строку как объект.

public class Invoice{ 
public string InvoiceNumber{get;set;} 
public string GrandTotal{get;set;} 
public string Date{get;set;} 
} 


    List<Invoice> invoicesList = new List<Invoice>(); 

    foreach (var invoice in theInvoices) 
    { 
     invoicesList.Add(new Invoice(){InvoiceNumber=invoice.InvoiceNumber,   
       GrandTotal= invoice.GrandTotal, 
      Date=FieldTranslation.ToShortDate(invoice.Date.ToString())}); 
    } 

Тогда есть пакет под названием NewtonSoftJson, который позволяет вам конвертировать из коллекции.

Перейти к пакету менеджера консоли (Нажмите на меню просмотра в визуальном Studio-> Другие окна -> Диспетчер пакетов консоли)

Install-Package Newtonsoft.Json

C# код

var invoiceListString = JsonConvert.SerializeObject (invoicesList);

+0

это не решит его проблему. (Независимо от того, что он уже использует json.net или нет.) – Dispersia

+0

ну, это должен быть класс перед использованием JsonConvert. –

+0

Новый код ближе, но вам нужно изменить 'Список invoicesList = новый Список ();' to 'Список invoicesList = новый Список ();' – Dispersia

0

Я рекомендую использовать NewtonSoft.Json.

public class Invoice 
{ 
    public string InvoiceNumber { get; set; } 
    public DateTime InvoiceDate { get; set; } 
    public string InvoiceTotal { get; set; } 
} 

public void PrintJson() 
{ 
    List<Invoice> InvoiceList = new List<Invoice>(); 

    var outputObject = new { InvoiceList }; 

    InvoiceList.Add(new Invoice { InvoiceNumber = "SALES0000001", InvoiceDate = DateTime.UtcNow, InvoiceTotal = String.Format("{0:c}", "90000") }); 
    InvoiceList.Add(new Invoice { InvoiceNumber = "SALES0000002", InvoiceDate = DateTime.UtcNow, InvoiceTotal = String.Format("{0:c}", "60000") }); 

    var output1 = JsonConvert.SerializeObject(outputObject); 
    var output2 = JsonConvert.SerializeObject(InvoiceList); 
} 

Output1

{"InvoiceList":[{"InvoiceNumber":"SALES0000001","InvoiceDate":"2017-02-22T16:46:31.6933956Z","InvoiceTotal":"90000"},{"InvoiceNumber":"SALES0000002","InvoiceDate":"2017-02-22T16:46:31.6933956Z","InvoiceTotal":"60000"}]}

Выход2

[{"InvoiceNumber":"SALES0000001","InvoiceDate":"2017-02-22T16:46:31.6933956Z","InvoiceTotal":"90000"},{"InvoiceNumber":"SALES0000002","InvoiceDate":"2017-02-22T16:46:31.6933956Z","InvoiceTotal":"60000"}]

Пожалуйста, обратите внимание на JSon в ваш вопрос не является действительным.

0

Как указано Dispersia, ваш список представляет собой один большой строковый список, и поэтому сериализатор json ведет себя по запросу - превращает этот большой список строк в большой массив строк json.

у меня нет VS под рукой, чтобы проверить код, приведенный ниже, но попробуйте включить свой список счетов-фактур в нечто вроде:

List<Tuple<String, String, String>> invoiceList = new List<>(); 

, а затем добавить кортежей соответственно:

foreach (var invoice in theInvoices) 
{ 
    Tuple<String, String, String> t = new Tuple<>(
     invoice.InvoiceNumber, 
     String.Format("{0:c}", invoice.GrandTotal), 
     FieldTranslation.ToShortDate(invoice.Date.ToString())); 
    invoicesList.Add(t); 
} 

Поможет ?