public class CarsModel
{        
    public int OnStock { get; set; }
    public int Rented { get; set; }
    public List<CarInfo> Cars { get; set; }
}
    
public class CarInfo
{
   [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public CarDetails Details { get; set; }

   [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
   public ServiceInfo ServiceInfo { get; set; }

   [JsonProperty( NullValueHandling = NullValueHandling.Ignore)]
   public MarketingInfo MarketingInfoDetails { get; set; }
 }  

Tergantung pada skenario, properti mobil ini akan memiliki representasi yang berbeda (MarketingInfo atau CarDetails atau ServiceInfo, tetapi tidak keduanya). kasus 1: Info Pemasaran

"onStock": 11,
"rented": 2,
"cars": [{
          "carId": 1,
          "MarketingInfo": {           
            "contactPerson": "John Smith"
          }, ...
        }]
    

Kasus 2: Info Layanan dan Detail Mobil

"onStock": 11,
"rented": 2,
"cars": [{       
          "ServiceInfo": {           
            "lastService": "2021-01-01"         
          }, 
          "CarDetails": {           
            "carId": 1,
            "lastOwner": "Mister Clark"
          }, ...
        }]

Beginilah cara saya mengisi tanggapan saya

var carsModel = new CarsModel{
    OnStock = 11,
    Rented = 2
};

foreach (var car in cars)
{
    carsModel.Cars.Add(new CarsModel 
    {
        MarketingInfoDetails = new MarketingInfo
        {
            ContactPerson = "John Smith",
            ....
        }
    });
}

Dalam representasi model di atas, respons saya TIDAK seperti yang saya inginkan (karena mengandung kata marketingInfoDetails)

Response:
{
  "data" :[{
      "onStock": 11,
      "rented": 2,
          "cars": [
            {
              "marketingInfoDetails": {
                "contactPerson": "John Smith",
                ...
              }
            }]
    }]
}

Di mana saya ingin diwakili tanpa nama "marketingInfoDetails"

{
    "data" : [{ 
        "onStock" : 11, 
        "rented" : 2, 
        "cars" : [{ "contactPerson" : "John Smith"}] 
    }] 
}

Silakan bagikan jika menurut Anda respons untuk skenario yang dijelaskan ini dapat dimodelkan dengan lebih baik.

0
user1765862 30 September 2021, 01:00

3 jawaban

Jawaban Terbaik

Model C# dan hasil JSON Anda cocok. Apa yang Anda minta berubah dari awal pertanyaan hingga akhir pertanyaan Anda. Apa yang tampaknya Anda inginkan dari model C# dan JSON adalah menghapus objek yang disertakan oleh contoh yang Anda inginkan di samping properti carId yang tidak ada dalam model C# Anda.

Anda perlu menghapus kelas CarInfo perantara dan sebagai gantinya membuat daftar mobil Anda menjadi antarmuka umum yang diwarisi oleh CarDetails, ServiceDetails, dan MarketingInfo, maka Anda tidak akan lihat properti "MarketingInfoDetails" di JSON Anda.

Jika Anda ingin menambahkan properti carId ke CarInfo dan sekali lagi membuat serial model C# ke JSON, Anda akan melihat bahwa model Anda saat ini sama persis dengan apa yang pertama kali Anda nyatakan yang Anda inginkan agar terlihat seperti JSON.

1
Andrew H 29 September 2021, 22:10

Jika Anda menggunakan Json.net, Anda dapat menggunakan fungsionalitas Serialisasi Bersyarat menggunakan ShouldSerialize.

Untuk membuat serial properti secara bersyarat, tambahkan metode yang mengembalikan boolean dengan nama yang sama dengan properti, lalu awali nama metode dengan ShouldSerialize. Hasil dari metode menentukan apakah properti tersebut serial. Jika metode mengembalikan true maka properti akan diserialkan, jika mengembalikan false maka properti akan dilewati.

Anda perlu memodifikasi DTO Anda untuk menyertakan properti dan metode tambahan (untuk setiap properti yang ingin Anda jadikan kondisional) sebagai berikut.

[JsonIgnore]
public bool SerializeDetails{get;set;} = true;
    
public bool ShouldSerializeDetails() =>SerializeDetails;

[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public CarDetails Details { get; set; }


[JsonIgnore]
public bool SerializeMarketingInfoDetails{get;set;} = true;
public bool ShouldSerializeMarketingInfoDetails() =>SerializeMarketingInfoDetails;
    
[JsonProperty( NullValueHandling = NullValueHandling.Ignore)]
public MarketingInfo MarketingInfoDetails { get; set; }

Untuk setiap instance CarDetails, Anda sekarang dapat menyetel properti SerializeMarketingInfoDetails atau SerializeDetails untuk membuat serial bersyarat.

Kode Demo

0
Anu Viswan 29 September 2021, 22:33

Sebaiknya gunakan EmiDefaultValue="true" untuk anggota data. Jika propertinya nol, properti itu tidak akan ditampilkan di json karena nilainya nol.

-1
Bechir Anoir Chabchoub 29 September 2021, 23:51