2011-02-26 16 views
27

necesito para obtener:Diccionario .NET Serialize <string, string> en JSON Clave Valor objeto par

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

    public string name { get; set; } 
    public List<Dictionary<string, string>> type { get; set; } 
} 

en:

{ 
    "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<string, string>() { { "http://random.url.as.key", "random/value" } }); 

consigo :

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

mientras que, con:

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

me sale:

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

no puede obtener la obsure http: //random.url.as.key que necesito. He intentado usar JavaScriptSerializer, DataContractJsonSerializer, y Custom Convertor for Json.NET, todos con limitaciones de éxito/deficiencias.

Tiene que haber una manera mejor/algo que estoy con vistas a obtener un objeto JSON sencilla sobre el alambre!

+0

lo está usando para serializar en JSON ? – Vadim

+3

La primera clase 'Package' no se compilará. ¿Y está seguro de que el campo * tipo * es una 'Lista >'? Parece que quieres que funcione como un 'Diccionario ' al convertir a JSON. –

+0

Utilícelo para serializar el código .net a JSON y revertirlo. http://james.newtonking.com/projects/json-net.aspx – Deepak

Respuesta

45

Bueno, en primer lugar, para el primer ejemplo, lo que, básicamente, tiene una lista de colecciones de objetos KeyValuePair<string,string>.

Por lo tanto, la razón por la que se convierte en el JSON se muestra es la siguiente:

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

En cuanto a su segundo ejemplo, se crea un objeto dinámico, que contiene un objeto dinámico, y cada uno de los objetos de los campos son los que proporcionan el valor clave.

Por lo tanto, sugeriría abandonando el exterior List<> alrededor del Dictionary<string,string>, a continuación, hacer uso del 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

bien, así que pensé que debería dar un ejemplo más concreto

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

    public string name { get; set; } 
    public Dictionary<string, string> 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 le dará la salida

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

Si quiero tener ambas wcf y json endpoints, ¿cómo encajaría este código? –

Cuestiones relacionadas