TransWikia.com

Separar una cadena json, guardando en variables con su respectivo valor

Stack Overflow en español Asked by Francisco Guillermo Herrera Ga on March 4, 2021

Este es el resultado de la consulta a un webservice

{"Nombre":"Juan","Apellido":"Luna","Edad":26,"FechaNacimiento":"09/03/1990 12:00:00 AM"}

Necesito de alguna forma separar los valores y guardarlos con el nombre de la variable y el valor que le corresponde, estoy haciéndolo en c# he logrado la separación de los elementos, pero no he podido crear variables y asignar valores, cabe mencionar que en algun momento lo que traiga el json puede cambiar, pueden ser mas o menos valores de eso no tengo el control, por eso quiero separarlos de manera dinamica y de igual forma asignarlos.

EsValido = "{"Nombre":"Juan","Apellido":"Luna","Edad":26,"FechaNacimiento":"09/03/1990 12:00:00 AM"}";
EsValido = EsValido.Replace(":", "");

String value = EsValido.Trim();

if (value.IndexOf("JUAN") != -1)
{
    string[] delimiter = { ",", "{", "}", """ };
    string[] substrings = value.Split(delimiter, StringSplitOptions.RemoveEmptyEntries);

    for (int i = 0; i < substrings.Length; i++)
    {
        if (i % 2 == 0)
        {
            Response.Write(substrings[i] + "<br/>");
        }
    }
}

3 Answers

Considerando lo dinámico de los datos utiliza un Diccionario.

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        var json = "{'Nombre':'Juan','Apellido':'Luna','Edad':26,'FechaNacimiento':'09/03/1990 12:00:00 AM'}";

        Dictionary <string,string> jsonObj = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string,string>>(json);

        foreach(var item in jsonObj.Keys){
            Console.WriteLine("Llave: {0} rnttttValor: {1}", item, jsonObj[item]);
        }

    }
}

El querer crear Propiedades dinámicas solo agregaría complejidad, con este acercamiento puedes ir guardando los Keys que vas recibiendo para tener un Catalogo de valores que puedes usar para modelar el rango posible de datos que recibirías del servicio.

Answered by Dan Miranda on March 4, 2021

¡Hola! es sencillo lo primero que debes hacer es convertir tu cadena a su notacion en Objetos y los haces de esta manera:

public class RootObject
{
    public string Nombre { get; set; }
    public string Apellido { get; set; }
    public int Edad { get; set; }
    public string FechaNacimiento { get; set; }
}

Ahora, ya teniendo el objeto solo te queda convertir tu JSON String en este objeto ¿Verdad? para esa magia hay 2 formas, utilizando el conversor nativo de c# y la libreria Newtonsoft te dejo las 2 soluciones:

Usando NewtonSoft:

string tuString = "{"Nombre":"Juan","Apellido":"Luna","Edad":26,"FechaNacimiento":"09/03/1990 12:00:00 AM"}";
RootObject m = JsonConvert.DeserializeObject<RootObject>(tuString);

string name = m.Nombre;
Console.WriteLine(name);

Ahora con el nativo de C#:

using System.Collections.Generic;
using System.Web.Script.Serialization;

RootObject data = new JavaScriptSerializer().Deserialize<RootObject>(tuString);

Saludos!

Answered by Gabriel Jeremy Rodriguez River on March 4, 2021

Según entiendo, lo que quieres hacer (en C#) es recibir un JSON y guardarlo en un objeto tipo

class Persona{
    string Nombre = "Juan";
    string Apellido = "Luna";
    int Edad = 26;
    DateTime FechaNacimiento = "09/03/1990";
}

Si ese es el caso, no te quiebres la cabeza; existe la librería Json de Newtonsoft que procesa el Json por ti, solo debes ir a su documentación para experimentar y ver cuál es la solución.

De entrada te digo que necesitas tener un objeto como el de arriba pero con get y set:

public class Persona{
    public string Nombre { get; set; }
    public string Apellido { get; set; }
    public int Edad { get; set; }
    public DateTime FechaNacimiento { get; set; }
}

y luego tratar tu Json con JObject:

var personaIntermedioObject = JObject.Parse(el_json);

para finalmente asignar al modelo Persona los datos:

Persona persona = new Persona(){
    Nombre = personaIntermedioObject["Nombre"].ToString(),
    Apellido = personaIntermedioObject["Apellido"].ToString(),
    Edad = Convert.ToInt32(personaIntermedioObject["Edad"]),
    FechaNacimiento = (DateTime)personaIntermedioObject["FechaNacimiento"]
}

O bien intentar parsearlo directamente con

Persona persona = JsonConvert.DeserializeObject<Persona>(el_json);

EDIT: Creo que entiendo tu pregunta. Lo que vas a recibir es un JSON que puede ser cualquier estructura, no solo la que diste de ejemplo, estilo

{nombre:"Juan",edad:"24"}
{estado:"Guanajuato",ciudad:"Celaya"}

y mostrarlos (o usarlos) como

Propiedad | Valor       Propiedad | Valor
---------------------   -----------------------
   nombre | Juan           estado | Guanajuato
     edad | 24             ciudad | Celaya

En ese caso, siguiendo con Json de Newtonsoft, necesitas un ciclo que recorra cada una de las parejas de Clave:Valor del Json. Un ejemplo que almacena los datos en un diccionario es:

System.Collections.Generic.Dictionary<string, object> dic = new System.Collections.Generic.Dictionary<string, object>();
foreach(JProperty obj in personaIntermedioObject.Properties())
{
    dic.Add(obj.Name, obj.Value);
    // O bien, imprimirlos en consola:
    Console.WriteLine("Clave: {0} | Valor: {1}", obj.Name, obj.Value.ToString())
}

De esa manera, puedes almacenar la información que sea, del tamaño que sea, en una estructura que puedes utilizar posteriormente.

Mi referencia: https://stackoverflow.com/questions/6522358/how-can-i-get-a-list-of-keys-from-json-net#6529408


EDIT 2:

Hasta donde sé, no puedes crear variables "al aire" (on the fly), lo más parecido que puedes hacer es usar un objeto dynamic de la siguiente manera:

dynamic DynObj = JObject.Parse(el_json);

De esa manera, puedes consultar sobre DynObj.Nombre.ToString() o DynObj.estado.ToString(). Además, ¿para qué quieres crear esos datos como variables si con un diccionario puedes recorrer libremente todos los datos? Toma en cuenta que incluso con los páginas Web (lo que adivino que haces por tus Response), antes de servir el aspx o el cshtml éste se tiene que compilar, no puedes estar agregando las variables así como así.

Lee sobre el tema: https://stackoverflow.com/questions/5033675/how-do-i-name-variables-dynamically-in-c#5033731

https://social.msdn.microsoft.com/Forums/en-US/09b93506-8ea3-4d5c-bf83-24f7daa032bc/creating-variables-at-runtime?forum=csharpgeneral

http://forums.codeguru.com/showthread.php?433691-Create-Variable-at-runtime

http://foro.elhacker.net/programacion_cc/crear_variable_en_runtime_con_nombre_propio-t301566.0.html;msg1495340

Answered by Kroneaux Schneider on March 4, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP