Deserializar Objeto em Asp. Net Core

12/07/2019

0


Preciso converter o objeto abaixo para Json, mas não consegui alguém tem uma sugestão:


{"status":1,"message":"OK","code":0,"dados":{"83865":{"coleta":"0","minuta":"83865","cte_serie":"2","cte_numero":"139957","eventos":[{"tipo":"2","data":"2019-07-05","hora":"13:05:26-03:","evento":"CTE Autorizado pelo SEFAZ","codigo":"125","log":"616072","obs":"AUTORIZADO PELA SEFAZ. PROT: 131190341799939","comprovante":""},{"tipo":"3","data":"2019-07-05","hora":"13:04:49","evento":"MANIFESTO EMITIDO","codigo":"102","log":"6079","obs":"","comprovante":""},{"tipo":"2","data":"2019-07-05","hora":"13:04:24","evento":"EM SEPARACAO","codigo":"111","log":"616030","obs":"Emiss\\u00e3o em lote.","comprovante":""}],"peso":"0.03","frete":"22.73","valor_notas":"292.90","trecho":{"origem":"CNT"},"status":"2","previsao_entrega":"2019-07-05 18:00:00"}}}
Elias Rodrigues

Elias Rodrigues

Responder

Posts

12/07/2019

Arão Garcéa

Fala Elias, tudo bom?

Olha, o que você postou já está em JSON.

Agora, se você quer criar classes para você popular com esse JSON, pode usar a ferramenta json2csharp (http://json2csharp.com/).

Eu usei teu JSON para ver o que sai, e só teve 1 problema, pois tem um nome de propriedade que começa com número, a "83865":

public class Evento
{
public string tipo { get; set; }
public string data { get; set; }
public string hora { get; set; }
public string evento { get; set; }
public string codigo { get; set; }
public string log { get; set; }
public string obs { get; set; }
public string comprovante { get; set; }
}

public class Trecho
{
public string origem { get; set; }
}

public class __invalid_type__83865
{
public string coleta { get; set; }
public string minuta { get; set; }
public string cte_serie { get; set; }
public string cte_numero { get; set; }
public List<Evento> eventos { get; set; }
public string peso { get; set; }
public string frete { get; set; }
public string valor_notas { get; set; }
public Trecho trecho { get; set; }
public string status { get; set; }
public string previsao_entrega { get; set; }
}

public class Dados
{
public __invalid_type__83865 __invalid_name__83865 { get; set; }
}

public class RootObject
{
public int status { get; set; }
public string message { get; set; }
public int code { get; set; }
public Dados dados { get; set; }
}

O ideal nesse caso, é alterar o nome da classe, para um nome válido e legível, e daí usar uma biblioteca como JSON.NET que permite você usar atributos C# para mapear classes com nomes diferentes do nome da propriedade.

Agora, se o nome dessa propriedade não for fixo (sempre "83865"), aí o problema é mais embaixo e eu gostaria de ver como vai se sair dessa, porque um projeto meu sofreu justamente por uma situação igual a essa. A API colocava dado no nome da propriedade!

Acho que dá para contornar, mas o trabalho é bem maior.

Boa sorte e espero ter ajudado!
Responder

15/07/2019

Elias Rodrigues

Fala Elias, tudo bom?

Olha, o que você postou já está em JSON.

Agora, se você quer criar classes para você popular com esse JSON, pode usar a ferramenta json2csharp (http://json2csharp.com/).

Eu usei teu JSON para ver o que sai, e só teve 1 problema, pois tem um nome de propriedade que começa com número, a "83865":

public class Evento
{
public string tipo { get; set; }
public string data { get; set; }
public string hora { get; set; }
public string evento { get; set; }
public string codigo { get; set; }
public string log { get; set; }
public string obs { get; set; }
public string comprovante { get; set; }
}

public class Trecho
{
public string origem { get; set; }
}

public class __invalid_type__83865
{
public string coleta { get; set; }
public string minuta { get; set; }
public string cte_serie { get; set; }
public string cte_numero { get; set; }
public List<Evento> eventos { get; set; }
public string peso { get; set; }
public string frete { get; set; }
public string valor_notas { get; set; }
public Trecho trecho { get; set; }
public string status { get; set; }
public string previsao_entrega { get; set; }
}

public class Dados
{
public __invalid_type__83865 __invalid_name__83865 { get; set; }
}

public class RootObject
{
public int status { get; set; }
public string message { get; set; }
public int code { get; set; }
public Dados dados { get; set; }
}

O ideal nesse caso, é alterar o nome da classe, para um nome válido e legível, e daí usar uma biblioteca como JSON.NET que permite você usar atributos C# para mapear classes com nomes diferentes do nome da propriedade.

Agora, se o nome dessa propriedade não for fixo (sempre "83865"), aí o problema é mais embaixo e eu gostaria de ver como vai se sair dessa, porque um projeto meu sofreu justamente por uma situação igual a essa. A API colocava dado no nome da propriedade!

Acho que dá para contornar, mas o trabalho é bem maior.

Boa sorte e espero ter ajudado!
Responder

15/07/2019

Elias Rodrigues

Fala Elias, tudo bom?

Olha, o que você postou já está em JSON.

Agora, se você quer criar classes para você popular com esse JSON, pode usar a ferramenta json2csharp (http://json2csharp.com/).

Eu usei teu JSON para ver o que sai, e só teve 1 problema, pois tem um nome de propriedade que começa com número, a "83865":

public class Evento
{
public string tipo { get; set; }
public string data { get; set; }
public string hora { get; set; }
public string evento { get; set; }
public string codigo { get; set; }
public string log { get; set; }
public string obs { get; set; }
public string comprovante { get; set; }
}

public class Trecho
{
public string origem { get; set; }
}

public class __invalid_type__83865
{
public string coleta { get; set; }
public string minuta { get; set; }
public string cte_serie { get; set; }
public string cte_numero { get; set; }
public List<Evento> eventos { get; set; }
public string peso { get; set; }
public string frete { get; set; }
public string valor_notas { get; set; }
public Trecho trecho { get; set; }
public string status { get; set; }
public string previsao_entrega { get; set; }
}

public class Dados
{
public __invalid_type__83865 __invalid_name__83865 { get; set; }
}

public class RootObject
{
public int status { get; set; }
public string message { get; set; }
public int code { get; set; }
public Dados dados { get; set; }
}

O ideal nesse caso, é alterar o nome da classe, para um nome válido e legível, e daí usar uma biblioteca como JSON.NET que permite você usar atributos C# para mapear classes com nomes diferentes do nome da propriedade.

Agora, se o nome dessa propriedade não for fixo (sempre "83865"), aí o problema é mais embaixo e eu gostaria de ver como vai se sair dessa, porque um projeto meu sofreu justamente por uma situação igual a essa. A API colocava dado no nome da propriedade!

Acho que dá para contornar, mas o trabalho é bem maior.

Boa sorte e espero ter ajudado!
Já fiz o problema que não consigo ler esses dados
Responder

17/07/2019

Elias Rodrigues

Consegui resolver usando o código abaixo:


var url = string.Format(Convert.ToString(_mySettings.UrlBuscaPorNota), cnpj, numeroNF, _mySettings.Token);
var client = new RestClient(url);
var request = new RestRequest("", Method.POST);
request.AddHeader("Content-type", "application/json");
var response = client.Execute(request);
var content = response.Content;
var contentJo = (JObject)JsonConvert.DeserializeObject(content);
if (contentJo["dados"] == null) {
return null;
}
var nodeFilho = ((JProperty)((JContainer)contentJo["dados"]).Last).Name;
var dados = contentJo["dados"][nodeFilho].ToString().Replace("}}", "}").Replace("{{", "{");
return JsonConvert.DeserializeObject<RootObject>(dados);
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar