【问题标题】:Create a JSON object using properties of a C# class使用 C# 类的属性创建 JSON 对象
【发布时间】:2020-09-23 15:46:18
【问题描述】:

我正在尝试为 REST api 调用构造一个请求正文,我需要创建一个 JSON 对象,其中包含我想要返回的属性列表。 例如:我有这个 C# 对象,我想取回:

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;
}

但我不想像这样对属性进行硬编码。

那么有什么方法可以使用我想要的对象中的属性名称,放入我在上面的方法中创建的字符串列表中?

谢谢!

【问题讨论】:

  • 我不太明白你的问题。您正在尝试通过将类型映射到骆驼大小写的jsonpath 属性名称列表来序列化对象图的预期属性列表。但是您想在接收端反序列化实际实例属性值?如何将类型信息映射到实例数据?
  • 嗨@dbc,我刚刚更新了这个问题。谢谢。
  • 听起来您可能想要使用图形查询。虽然可以使用 REST,但它是相当多的工作。这里有一些答案可能会有所帮助:stackoverflow.com/questions/40871190/…

标签: c# .net json serialization json.net


【解决方案1】:

如果我理解正确,您需要模型的元数据。 如果您使用 EntityFramework,您可以获得模型的元数据

来自this Code

并调用 BuildJsonMetadata() 函数

如果您使用其他映射器,我没有看到任何现有的生成模型元数据的工具,您必须手动生成它 类似于this

【讨论】:

    【解决方案2】:

    首先,如果你序列化你拥有的类(SomeProperties),你将不会得到driver.name。相反,你会得到一个像这样的字符串,它将驱动程序显示为一个对象,

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

    也就是说,如果您有兴趣获得这样的 json,

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

    您将需要一个仅包含字符串列表的类(非常简单的类)。 properties 不是对象数组,而只是字符串。从FetchProperties 方法的外观来看,您正在创建一个以 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
    }
    
    

    现在您可以选择硬编码这些值,或者将它们作为参数传递,或者使用包含您打算存储为“属性”的所有字符串列表的局部变量。由于违反命名约定(driver.name),您不能使用枚举,因此这些选项就足够了。

    【讨论】:

      猜你喜欢
      • 2017-08-11
      • 2023-03-30
      • 2014-07-28
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多