Serialize .NET Dictionary en JSON Key Value Pair Object

Necesito conseguir:

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

dentro:

 { "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" } }); 

Yo obtengo:

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

mientras, con:

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

Yo obtengo:

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

No puedo obtener la http: //random.url.as.key obscura que necesito. He intentado usar JavaScriptSerializer, DataContractJsonSerializer y Custom Convertor para Json.NET, todos con limitaciones de éxito / deficiencias.

Debe haber una mejor manera / algo que estoy pasando por alto para obtener un objeto JSON simple sobre el cable.

Bueno, primero, para el primer ejemplo, lo que tienes básicamente es una lista de colecciones de KeyValuePair .

Entonces, la razón por la que se convierte al JSON que se muestra es esta:

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

En cuanto a su segundo ejemplo, está creando un objeto dynamic, que contiene un objeto dynamic, y cada uno de los campos del objeto son los que proporcionan el valor clave.

Por lo tanto, sugeriría abandonar la List<> externa List<> alrededor del Dictionary , luego utilizar el objeto Newtonsoft.Json.Converters.KeyValuePairConverter en la biblioteca JSON.Net al hacer su serialización:

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

Espero que ayude.

EDITAR

De acuerdo, entonces pensé que debería dar un ejemplo más 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( ) ); 

Esto te dará la salida

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