Pregunta

Estoy intentando usar linq para dar forma a la lista de datos en una forma particular que se devolverá como Json de una llamada ajax.

Dados estos datos:

var data = new List<string>();
data.Add("One");
data.Add("Two");
data.Add("Three");

Y este código: ** ¡Lo cual no es correcto y es lo que hay que arreglar! **

var shaped = data.Select(c =>
    new { c = c }
).ToList();

serializer.Serialize(shaped,sb);
string desiredResult = sb.ToString();

Me gustaría que desiredResult sea:

{
    "One": "One",
    "Two": "Two",
    "Three": "Three"
}

pero actualmente es:

{" c " : " Uno " }, {" c " : " Dos " } , etc.

Un problema es que en el lado izquierdo del inicializador de objetos quiero el valor de c , no c en sí ...

¿Fue útil?

Solución

Solución ofrecida para la corrección, no para el rendimiento.

        List<string> data = new List<string>()
        {
            "One",
            "Two",
            "Three"
        };

        string result =
            "{ "
            +
            string.Join(", ", data
              .Select(c => @"""" + c + @""": """ + c + @"""")
              .ToArray()
            ) + " }";

Otros consejos

En json, la "c" en " c " : " Uno " es el nombre de la propiedad Y en el mundo C #, no puede crear nombres de propiedades sobre la marcha (ignorando System.ComponentModel).

Básicamente, no creo que puedas hacer lo que quieras.

¿Qué pasa con el uso de JSON.NET ?

Estoy respondiendo a esta vieja pregunta solo porque todas las otras respuestas son básicamente incorrectas o incompletas.

JSON es realmente simple, así que, básicamente, para obtener el JSON que desea, necesita comprender la diferencia entre las matrices JSON:

["one", "two", "three"]

y objetos / diccionarios JSON (los objetos y diccionarios son realmente lo mismo):

{"a": "one", "b": "two", "c": 3}

Tenga en cuenta la " c " El elemento es de un tipo diferente, pero esto no es un problema para Javascript.

Dado esto, casi todos los serializadores que uso bajo .NET (que es casi siempre el gran JSON.NET ) convierte objetos .NET o diccionarios .NET en objetos JSON.

Entonces, lo que necesita es convertir una Lista a un Diccionario, y luego alimentar el serializador con un diccionario u objeto. Otra pregunta es por qué le gustaría tener un diccionario con un valor igual a la clave, pero aceptaré ese punto incluso si tengo dudas.

Ejemplo dado:

        List<string> source = new List<string>() { "a", "b", "c" };

        Dictionary<string, string> dict = source.ToDictionary(el => el, el => el);

        var jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(dict);
        // jsonString should be "{'a':'a', 'b':'b', 'c':'c'}", with more or less whitespace depending on formatting
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top