2013-04-09 2 views
0

Мне нужно сериализовать объект JSON, который выглядит следующим образом:прилагая к объекту JSON с помощью Json.NET

{ 
    "Documents": [ 
     { 
     "Title": "", 
     "DatePublished": "", 
     "DocumentURL": "", 
     "ThumbnailURL": "", 
     "Abstract": "", 
     "Sector": "", 
     "Country": [ 
      "", "", "" 
     ], 
     "Document Type": "" 
     } 
    ] 
} 

Что я делаю принимает данные от сервера SQL и сохранение результатов в объект как это:

public List<Dictionary<string, string>> GetResults() 
{ 
    int index = 0; 
    while (this.myReader.Read()) 
    { 

     this.dataFrmDb = new Dictionary<string, string>(); 
     for (int i = 0; i < myReader.FieldCount; i++) 
     { 
      if (myReader.GetName(i) == "Country") 
      { 
       string[] delimiter = { " _qfvcq_ " }; 
       string text = myReader[myReader.GetName(i)].ToString(); 
       string[] results = text.Split(delimiter, StringSplitOptions.None); 

       //This list stores the values for "Country". 
       List<string> countries = new List<string>(); 
       for (int j = 0; j < results.Count(); j++) 
       { 
        countries.Add(results[j].ToString()); 
       } 
      } 
      else 
      {       
       this.dataFrmDb.Add(myReader.GetName(i), 
          myReader[myReader.GetName(i)].ToString()); 
      } 
     } 

     this.dictList.Add(this.dataFrmDb); 
    } 
    return this.dictList; 
} 

мне взять эти данные и сериализовать как это:

Database connect = new Database(
    System.Configuration.ConfigurationManager.AppSettings["DatabaseConnectionString"], 
    System.Configuration.ConfigurationManager.AppSettings["StoredProcedure"]); 

List<Dictionary<string, string>> dataResults = connect.GetResults();   

Dictionary<string, List<Dictionary<string, string>>> myList = 
      new Dictionary<string, List<Dictionary<string, string>>>(); 

myList.Add("Documents", dataResults); 

string ans = JsonConvert.SerializeObject(myList, Formatting.Indented); 
System.Console.WriteLine(ans); 

я получить надлежащее outpu t, но если вы посмотрите в исходном формате JSON, «Страна» должна иметь несколько значений. Я не знаю, как реализовать это в этом объекте JSON. Как добавить список со значениями «Страна» в объект JSON с помощью JSON.net? Есть ли еще один способ сделать это?

ответ

2

Если изменить dataFrmDb быть Dictionary<string, object> вместо Dictionary<string, string>, то вы можете хранить страны перечисляют в нее, как и другие ценности. Json.Net затем сериализует его, как вы хотите.

Ниже приведен пример программы, которая демонстрирует:

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Dictionary<string, object>> dataResults = GetResults();   
     Dictionary<string, List<Dictionary<string, object>>> myList = 
         new Dictionary<string, List<Dictionary<string, object>>>(); 
     myList.Add("Documents", dataResults); 
     string ans = JsonConvert.SerializeObject(myList, Formatting.Indented); 
     System.Console.WriteLine(ans); 
    } 

    public static List<Dictionary<string, object>> GetResults() 
    { 
     List<Dictionary<string, object>> dictList = new List<Dictionary<string, object>>(); 

     Dictionary<string, object> dataFrmDb = new Dictionary<string, object>(); 
     dataFrmDb.Add("Title", "An Example Document"); 
     dataFrmDb.Add("DatePublished", DateTime.Now.ToString()); 
     dataFrmDb.Add("DocumentURL", "http://www.example.org/documents/1234"); 
     dataFrmDb.Add("ThumbnailURL", "http://www.example.org/thumbs/1234"); 
     dataFrmDb.Add("Abstract", "This is an example document."); 
     dataFrmDb.Add("Sector", "001"); 
     dataFrmDb.Add("Country", new List<string> { "USA", "Bulgaria", "France" }); 
     dataFrmDb.Add("Document Type", "example"); 

     dictList.Add(dataFrmDb); 
     return dictList; 
    } 
} 

Выход:

{ 
    "Documents": [ 
    { 
     "Title": "An Example Document", 
     "DatePublished": "4/9/2013 7:25:05 PM", 
     "DocumentURL": "http://www.example.org/documents/1234", 
     "ThumbnailURL": "http://www.example.org/thumbs/1234", 
     "Abstract": "This is an example document.", 
     "Sector": "001", 
     "Country": [ 
     "USA", 
     "Bulgaria", 
     "France" 
     ], 
     "Document Type": "example" 
    } 
    ] 
} 

Несколько более простой способ сделать это, чтобы создать отдельные классы для хранения данных, как это было предложено Джои Геннари. Json.NET также может сериализовать их. Классы данных будет выглядеть примерно так:

class Result 
{ 
    public List<Document> Documents { get; set; } 

    public Result() 
    { 
     Documents = new List<Document>(); 
    } 
} 

class Document 
{ 
    public string Title { get; set; } 
    public string DatePublished { get; set; } 
    public string DocumentURL { get; set; } 
    public string ThumbnailURL { get; set; } 
    public string Abstract { get; set; } 
    public string Sector { get; set; } 
    public List<string> Country { get; set; } 
    [JsonProperty(PropertyName="Document Type")] 
    public string DocumentType { get; set; } 

    public Document() 
    { 
     Country = new List<string(); 
    } 
} 

А вот использование:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Document doc = new Document(); 
     doc.Title = "An Example Document"; 
     doc.DatePublished = DateTime.Now.ToString(); 
     doc.DocumentURL = "http://www.example.org/documents/1234"; 
     doc.ThumbnailURL = "http://www.example.org/thumbs/1234"; 
     doc.Abstract = "This is an example document."; 
     doc.Sector = "001"; 
     doc.Country.Add("USA"); 
     doc.Country.Add("Bulgaria"); 
     doc.Country.Add("France"); 
     doc.DocumentType = "example"; 

     Result result = new Result(); 
     result.Documents.Add(doc); 

     string json = JsonConvert.SerializeObject(result, Formatting.Indented); 
     System.Console.WriteLine(json); 
    } 
} 

Выход для этого примера точно такой же, как и первый.

1

Это другой способ решить это с помощью DataContractJsonSerializer. Сначала нужно создать класс для представления объекта:

[DataContract] 
    public class DocumentHolder 
    { 
     [DataMember(Name = "Documents")] 
     public Documents Document { get; set; } 
    } 

    [DataContract] 
    public class Documents 
    { 
     [DataMember(Name = "Title", Order = 1)] 
     public string Title { get; set; } 
     [DataMember(Name = "DatePublished", Order = 2)] 
     public DateTime? DatePublished { get; set; } 
     [DataMember(Name = "DocumentURL", Order = 3)] 
     public string DocumentURL { get; set; } 
     [DataMember(Name = "ThumbnailURL", Order = 4)] 
     public string ThumbnailURL { get; set; } 
     [DataMember(Name = "Abstract", Order = 5)] 
     public string Abstract { get; set; } 
     [DataMember(Name = "Sector", Order = 6)] 
     public string Sector { get; set; } 
     [DataMember(Name = "Country", Order = 7)] 
     public List<string> Country { get; set; } 
     [DataMember(Name = "Document Type", Order = 8)] 
     public string DocumentType { get; set; } 

     public Documents() 
     { 
      this.Country = new List<string>(); 
     } 
    } 

Вот как вы бы заполнить объект и сериализовать его:

static void Main(string[] args) 
    { 
     var documentholder = new DocumentHolder { Document = new Documents { Title = "Title 1", DatePublished = DateTime.Now, Sector = "A17", Country = new List<string> { "EN-US", "EN-GB" } } }; 
     DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(DocumentHolder)); 
     var ms = new MemoryStream(); 
     serializer.WriteObject(ms, documentholder); 
     var text = Encoding.UTF8.GetString(ms.ToArray()); 
    } 
+0

Я использую .NET 3.5 Я заметил, что Data Contracts для 4.0 и еще есть другое решение, которое вы имеете в виду? – Kreston

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