簡體   English   中英

使用 C# class 的屬性創建 JSON object

[英]Create a JSON object using properties of a C# class

I'm trying to construct a request body for a REST api call, and I need to create a JSON object with the list of properties I want to get back. 例如:我有這個 C# object 我想取回:

public class SomeProperties
{
    public string TicketNumber { get; set; }
    public Driver Driver { get; set; }
}

public class Driver
{
    public string Name { get; set; }
}

為了得到這個,我需要將這些屬性放在 JSON 請求正文中,如下所示:

"properties": [
"ticketNumber",
"driver.name"
]

我的嘗試如下所示:

private string FetchProperties()
{
    var fetchProperties = new
    {
        properties = new List<string>
                        {
                            "ticketNumber",
                            "driver.name"
                        }
    };

    var jsonResult = JsonConvert.SerializeObject(fetchProperties, Formatting.None);
    return jsonResult;
}

但我不想對這樣的屬性進行硬編碼。

那么有什么方法可以使用我想要的 object 中的屬性名稱來放入我在上述方法中創建的字符串列表中?

謝謝你!

如果我理解正確,您需要 model 的元數據。 如果您使用 EntityFramework,您可以獲得 model 的元數據

本守則

並調用 BuildJsonMetadata() function

如果您使用其他映射器,我看不到任何現有的生成 model 元數據的工具,您必須像這樣輕松生成它

首先,如果您序列化您擁有的 class ( SomeProperties ),您將不會獲得driver.name 相反,你會得到一個像這樣的字符串,它將驅動程序顯示為 object,

{
  properties : {
    "ticketNumber" : "stringvalue",
    "driver"       : {
      "name" : "stringValue"
    }
  }
}

也就是說,如果您有興趣獲得這樣的 json,

"properties": [
  "ticketNumber",
  "driver.name"
]

您將需要一個僅包含字符串列表的 class (非常簡單)。 properties不是對象數組,而只是字符串。 FetchProperties方法的外觀來看,您正在創建一個 object,其中 fetchProperties 作為 RootObject。 試試這樣的,

public class MyClass
{
    [JsonProperty("fetchProperties")]
    public Fetch FetchProperties { get; set; }
}
public class Fetch
{
    [JsonProperty("properties")]
    public List<string> Properties { get; set; }
}

private string FetchProperties()
{
    MyClass obj = new MyClass()
    {
        FetchProperties = new Fetch()
        {
            Properties = new List<string>() { "ticketNumber", "driver.Name" }
        }
    };
    return JsonConvert.SerializeObject(obj); // Formatting.None is by default
}

現在,您可以選擇硬編碼這些值,或者將它們作為 arguments 傳遞,或者使用包含您打算存儲為“屬性”的所有字符串列表的局部變量。 由於違反命名約定(driver.name),您不能使用枚舉,因此這些選項就足夠了。

暫無
暫無

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

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