Serializzare il dizionario .NET nell’object coppia chiave valore JSON

Ho bisogno di ottenere:

public class Package { public Package() { name = ""; type = new List<Dictionary>(); } public string name { get; set; } public List<Dictionary> type { get; set; } } 

in:

 { "name":"package_name", "type": { "http://random.url.as.key":"random/value" } } 

con:

 Package package = new Package(); package.name = "package_name"; package.type.Add(new Dictionary() { { "http://random.url.as.key", "random/value" } }); 

Ottengo:

 { "name":"package_name", "type": [ [ { "Key":"http:\/\/random.url.as.key", "Value":"random\/value" } ] ] } 

mentre, con:

 var package = new { name = "package_name", type = new { http_random_url_as_key = "random/value" } }; 

Ottengo:

 { "name":"package_name", "type": { "http_random_url_as_key":"random/value" } } 

Non riesco a ottenere l’ http: //random.url.as.key di cui ho bisogno. Ho provato a utilizzare JavaScriptSerializer, DataContractJsonSerializer e Custom Convertor per Json.NET, tutti con scarso successo / carenze.

Ci deve essere un modo migliore / qualcosa che sto trascurando per ottenere un semplice object JSON sul filo!

Bene, per prima cosa, per il primo esempio, quello che in pratica è un elenco di raccolte di KeyValuePair .

Quindi, il motivo per cui viene convertito nel JSON mostrato è questo:

 { "name":"package_name", "type": [ // List> [ // Dictionary, a list of KeyValuePair objects { // KeyValuePair object "Key":"http:\/\/random.url.as.key", "Value":"random\/value" } ] ] } 

Per quanto riguarda il tuo secondo esempio, stai creando un object dinamico, contenente un object dinamico, e ognuno dei campi dell’object fornisce ciò che fornisce il valore chiave.

Quindi, suggerirei di abbandonare l’ List<> esterno List<> attorno al Dictionary , quindi utilizzare l’object Newtonsoft.Json.Converters.KeyValuePairConverter nella libreria JSON.Net quando si esegue la serializzazione:

 string json = JsonConvert.SerializeObject( package, new KeyValuePairConverter( ) ); 

Spero possa aiutare.

MODIFICARE

Ok, ho pensato di dare un esempio più concreto

 public class Package { public Package() { name = ""; type = new Dictionary(); } public string name { get; set; } public Dictionary type { get; set; } } Package package = new Package(); package.name = "package_name"; package.type.Add("http://random.url.as.key", "random/value"); string json = JsonConvert.SerializeObject( package, new KeyValuePairConverter( ) ); 

Questo ti porterà l’output

 { "name":"package_name", "type": { "http://random.url.as.key":"random/value" } }