簡體   English   中英

將 json 反序列化為新對象

[英]Deserializing json into new objects

我正在從我不擁有的 api 中讀取一些 Json,因此,我無法更改響應。 當我使用 Newtonsoft 將 Json 反序列化為 C# 對象時,我遇到了“ChangedAttributes”字段的問題。 創建這些類時,Visual Studio 想要為“Sex”創建一個類,並為“MaritalStatus”創建一個類,但它們沒有被填充。 此外,ChangedAttributes 列表可以是數百種不同的可能性。 所以,我想將這些屬性反序列化為一個泛型類,比如:

public class Attribute
{

public string Name {get;set;}
public string Old {get;set;}
public string New {get;set;}
}

有人可以告訴我如何使用 Newtonsoft 實現這一目標嗎? 這是我試圖解析的 Json 示例:

{
  "Context" : [ {
    "PersonName" : "Smith, Bob",
    "PersonNumber" : "001246",
    "PrimaryPhoneNumber" : "",
    "PersonId" : "300000009560451",
    "WorkerType" : "EMP",
    "PeriodType" : "E",
    "DMLOperation" : "UPDATE",
    "EffectiveStartDate" : "2004-08-27",
    "EffectiveDate" : "2004-08-27"
  } ],
  "Changed Attributes" : [ {
    "Sex" : {
      "old" : null,
      "new" : "M"
    }
  }, {
    "MaritalStatus" : {
      "old" : null,
      "new" : "S"
    }
  } ]
}

以下是 VS 為我生成的 C# 類:

public class AtomFeed_Empupdate
{
    public AtomFeed_Empupdate_Context[] Context { get; set; }
    public AtomFeed_Empupdate_ChangedAttribute[] ChangedAttributes { get; set; }
}

public class AtomFeed_Empupdate_Context
{
    public string PersonName { get; set; }
    public string PersonNumber { get; set; }
    public string WorkEmail { get; set; }
    public string PrimaryPhoneNumber { get; set; }
    public string PersonId { get; set; }
    public string WorkerType { get; set; }
    public string PeriodType { get; set; }
    public string DMLOperation { get; set; }
    public string EffectiveStartDate { get; set; }
    public string EffectiveDate { get; set; }
}

public class AtomFeed_Empupdate_ChangedAttribute
{
    public AtomFeed_Empupdate_Sex Sex { get; set; }
    public AtomFeed_Empupdate_Maritalstatus MaritalStatus { get; set; }
}

public class AtomFeed_Empupdate_Sex
{
    public string old { get; set; }
    public string _new { get; set; }
}

public class AtomFeed_Empupdate_Maritalstatus
{
    public string old { get; set; }
    public string _new { get; set; }
}

這是我反序列化 Json 的方式:

AtomFeed_Empupdate eu = Newtonsoft.Json.JsonConvert.DeserializeObject<AtomFeed_Empupdate>(json);

謝謝你的幫助!

您可以稍微更改Attribute類並使用具有正確名稱的JsonProperty屬性對其進行裝飾

public class Attribute
{
    [JsonProperty("old")]
    public string Old { get; set; }
    [JsonProperty("new")]
    public string New { get; set; }
}

並使用Dictionary<string, Attribute>[] (因為你有一個鍵值對數組)作為Changed Attributes JSON 令牌

public class AtomFeed_Empupdate
{
    public AtomFeed_Empupdate_Context[] Context { get; set; }
    [JsonProperty("Changed Attributes")]
    public Dictionary<string, Attribute>[] ChangedAttributes { get; set; }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM