Quiero convertir lo que en última instancia es un diccionario en JSON en un diccionario C# sin demasiado preámbulo.
¿Estoy ladrando en el árbol equivocado usando la biblioteca JSON.NET aquí? La clase JArray no quiere darme nada para acceder al atributo (solo el valor), es decir, me dice el valor, pero nunca la "clave".
No puedo creer que nadie más encuentre esta limitación, así que supongo que me estoy perdiendo algo. Mi intento confusa es la siguiente:Usando JSON.NET para acceder a los atributos JSON para crear un diccionario C#
Dada esta JSON:
{
"appSettings" : [
{"rows": "5"},
{"columns" : "7"}
]
}
me gustaría seleccionar esto en un diccionario como esto:
var dict = jsonObject["appSettings"].Select(s => new
{
key = s.Name, // wish this property existed
value = s.Value // wish this property existed
}).ToDictionary(s => s.key, s => s.value);
Ésta es mi unittest:
[Test]
public void CanLoadJsonAppSettings()
{
var json = @"
""{appSettings"" : [
{""ViewRows"" : ""1""},
{""ViewColumns"" : ""2""}
]}";
var dict = CreateJsonDictionary(json);
Assert.That(dict.Count, Is.EqualTo(2));
}
public CreateJsonDictionary(string jsonText)
{
var jsonObject = JObject.Parse(jsonText);
return jsonObject["appSettings"].Select(s => new
{
key = s.Name,
value = s.Value
}).ToDictionary(s => s.key, s => s.value);
}
EDIT: Gracias a @jim, estamos un poco más cerca. Para completar, documentaré el paso ligeramente incómodo que necesitaba para obtener el objeto que necesitaba:
Tuve que cambiar mi JSON. En lugar de utilizar una matriz (como en el código anterior) que utiliza una forma más sencilla diccionario/más cierto:
var json = @"
{
""appSettings"" : {
""ViewRows"" : ""1"",
""ViewColumns"" : ""2""
}
}";
Luego tuve que Analizar, conseguir un JSON jobject, a continuación, convertir de nuevo a una cadena , y luego Deserialize:
var jo = JObject.Parse(jsonText);
var appSettings = jo["appSettings"];
var appSettings = JsonConvert.DeserializeObject<Dictionary<string, string>>(appSettings.ToString());
Así que parte de mi problema, era conseguir JSON confundido. Aun así, si hay una forma más elegante de hacerlo, soy todo oídos.
EDIT2: Aún tenía que resolver el problema original anterior, convirtiendo una matriz JSON en un diccionario. Una vez que mi JSON se corrige para contener pares nombre/valor apropiado:
"connectionStrings": [
{"name" : "string1", "value" : "value1"},
{"name" : "string2", "value" :"value2"},
]
Este es el código que lo resolvió (nb se parece mucho a mi intento inicial):
var jsonObj = JObject.Parse(jsonText);
var conStrings = jsonObj.Properties().Select(s =>
new {
key = s.Name,
value = s.Value.ToString()
}).ToDictionary(s => s.key, s => s.value);
Y esto sólo funciona si no tienes otras matrices
en realidad estoy usando la biblioteca JSON.NET en mi pregunta. Fue parte del problema. – PandaWood