如何反序列化在单个类中具有块的JSON文件?是否可以通过Class中的JSON注释告知属性的父块和属性?
JSON如下:
{
"Viagem": {
"Id": 33333,
"NumeroAtracacao": "22/2222",
"NumeroViagem": "02002 00303",
"Status": "DESATRACADO",
"Joint": "UCLA UCLA",
"Servico": "AMERICA CENTRAL",
"MotivoEspera": "-",
"LiberacaoRecebimento": "21/05/2018 07:00:00",
"Navio": {
"Nome": "MONTE CERVANTES",
"Armador": {
"Id": 0,
"CodigoGeParcei": null,
"Nome": "ALIANCA",
"Sigla": "ALI",
"CnpjCpf": null,
"Endereco": null,
"Cep": null,
"Site": null
},
"ImagemNavio": ".......",
"Comprimento": 272.08,
"Lloyd": 9283186,
"CallSign": "DHTK",
"CapacidadeTeus": 5560,
"Shortname": "MOCER"
},
"ChegadaPrevista": "27/05/2018 12:00:00",
"AtracacaoPrevista": "29/05/2018 07:00:00",
"SaidaPrevista": "30/05/2018 19:00:00",
"DeadLine": "25/05/2018 12:00:00"
}
}
这是我想用来反序列化JSON的类:
namespace WS_SantosBrasil.Model
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.Spatial;
[Table("Viagem")]
public partial class Viagem
{
[Key]
[Column(Order = 0)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
[Key]
[Column(Order = 1)]
[StringLength(50)]
public string IdCtis { get; set; }
[StringLength(20)]
public string NumeroAtracacao { get; set; }
[StringLength(20)]
public string NumeroViagem { get; set; }
[StringLength(50)]
public string Status { get; set; }
[StringLength(50)]
public string Joint { get; set; }
[StringLength(50)]
public string Servico { get; set; }
[StringLength(50)]
public string MotivoEspera { get; set; }
[StringLength(20)]
public string LiberacaoRecebimento { get; set; }
[StringLength(20)]
public string ChegadaPrevista { get; set; }
[StringLength(20)]
public string AtracacaoPrevista { get; set; }
[StringLength(20)]
public string SaidaPrevista { get; set; }
[StringLength(20)]
public string DeadLine { get; set; }
[StringLength(20)]
public string Chegada { get; set; }
[StringLength(20)]
public string Atracacao { get; set; }
[StringLength(20)]
public string Saida { get; set; }
[StringLength(20)]
public string InicioOperacao { get; set; }
[StringLength(20)]
public string FimOperacao { get; set; }
[StringLength(50)]
public string TipoOperacao { get; set; }
[StringLength(20)]
public string CodigoCodesp { get; set; }
public decimal? CaladoAtracacao { get; set; }
public decimal? CaladoDesatracacao { get; set; }
[StringLength(20)]
public string NumeroViagemImportacao { get; set; }
[StringLength(20)]
public string NumeroViagemExportacao { get; set; }
[StringLength(20)]
public string PrevisaoDescarga { get; set; }
[StringLength(20)]
public string PrevisaoEmbarque { get; set; }
[StringLength(20)]
public string PrevisaoRemocao { get; set; }
[StringLength(50)]
public string LocalAtracacao { get; set; }
[StringLength(100)]
public string Navio_Nome { get; set; }
public string ImagemNavio { get; set; }
public decimal? Navio_Comprimento { get; set; }
[StringLength(20)]
public string Navio_Lloyd { get; set; }
[StringLength(50)]
public string Navio_CallSign { get; set; }
public int? Navio_CapacidadeTeus { get; set; }
[StringLength(20)]
public string Navio_Shortname { get; set; }
public int? Armador_Id { get; set; }
[StringLength(20)]
public string Armador_CodigoGeParcei { get; set; }
[StringLength(100)]
public string Armador_Nome { get; set; }
[StringLength(10)]
public string Armador_Sigla { get; set; }
[StringLength(20)]
public string Armador_CnpjCpf { get; set; }
[StringLength(100)]
public string Armador_Endereco { get; set; }
[StringLength(20)]
public string Armador_Cep { get; set; }
[StringLength(100)]
public string Armador_Site { get; set; }
public virtual ContainerViagem ContainerViagem { get; set; }
}
}
在反序列化此类的JSON时,如何通知例如Nome_Navio属性位于Navio块内,并且JSON属性是否为NOME?
答案 0 :(得分:2)
您确定不想像CodeCaster所说的那样创建一个类来映射它吗?
public class Viagem
{
public int Id {get; set;}
public string NumeroAtracacao {get; set;}
public string Status {get; set;}
public string Joint {get; set;}
public string Servico {get; set;}
public string MotivoEspera {get; set;}
public Navio Navio {get; set;}
public DateTime ChegadaPrevista {get; set;}
public DateTime AtracacaoPrevista {get; set;}
public DateTime SaidaPrevista {get; set;}
public DateTime DeadLine {get; set;}
}
public class Navio
{
public string Nome {get; set;}
public Armador Armador {get; set;}
public string ImagemNavio {get; set;}
public int Comprimento {get; set;}
public int Lloyd {get; set;}
public string CallSign {get; set;}
public string CapacidadeTeus {get; set}
public string Shortname {get; set;}
}
public class Armador
{
public int Id {get; set;}
public object CodigoGeParcei {get; set;}
public string Nome {get; set;}
public string Sigla {get; set;}
public object CnpjCpf {get; set;}
public object Endereco {get; set;}
public object Cep {get; set;}
public object Site {get; set;}
}
您可以直接进行
JsonConvert.DersializeObject<Viagem>(json);
(如果您使用的是Newtonsoft)
答案 1 :(得分:1)
您应该能够使用JsonPathConverter
中的Can I specify a path in an attribute to map a property in my class to a child property in my JSON?类来完成所需的操作。
要使用它,首先向您的[JsonConverter]
类添加一个Viagem
属性,指定JsonPathConverter
,如下所示:
[JsonConverter(typeof(JsonPathConverter))]
public partial class Viagem
{
...
}
然后,对于要从JSON反序列化的每个属性,添加一个[JsonProperty]
属性,以指定其在JSON中以点分隔的路径。以下是一些示例:
[JsonProperty("Viagem.Id")]
public int Id { get; set; }
[JsonProperty("Viagem.Status")]
public string Status { get; set; }
[JsonProperty("Viagem.Navio.Nome")]
public string Navio_Nome { get; set; }
[JsonProperty("Viagem.Navio.ImagemNavio")]
public string ImagemNavio { get; set; }
[JsonProperty("Viagem.Navio.Armador.Id")]
public int? Armador_Id { get; set; }
[JsonProperty("Viagem.Navio.Armador.Nome")]
public string Armador_Nome { get; set; }
然后您可以像往常一样反序列化,它应该“正常工作”:
Viagem viagem = JsonConvert.DeserializeObject<Viagem>(json);
这是一个有效的演示:https://dotnetfiddle.net/repgUW
请注意,如果您需要将模型序列化回JSON,则需要在转换器中实现WriteJson
方法。链接的问题线程中有another answer,建议为此实现,但我尚未对其进行测试。
答案 2 :(得分:0)
否,您不想将JSON直接映射到数据库实体类。您可以花很长的时间do some attribute and custom serializer logic,但这是维护的噩梦(如果JSON或实体的结构发生变化,该怎么办?)。
相反,生成一个类以将该JSON反序列化为该类,然后将该类的字段映射到您的实体。