【问题标题】:C# Return JSON object but original object did not set propertyC# 返回 JSON 对象但原始对象未设置属性
【发布时间】:2020-01-03 10:17:56
【问题描述】:

我正在编写一个返回对象 MyObject 的 WebApi。 MyObject 类是在另一个 DLL 中定义的,我无法修改它的源代码。这个 MyObject 类没有放置 setter/getter,所以公共成员不是属性,它们只是字段。

所以在我的 WebApi 代码中,我想返回这个 Json MyObject,但我在 http 请求中得到的只是一个空的 {} json 数据,当我知道该对象确实包含数据时。唯一的区别是它没有发布 setter/getter,这就是它返回 {} 的原因。

我怎样才能将 MyObject 作为 Json 与数据一起返回,而不必制作我自己的 MyOwnObject,其中所有确切的字段,但属性将它们设置为 get/set 属性?

例如,如果我使用

public class MyObject
{
    public string name;
}

即使 name 包含某些内容,此版本也会返回空 {} 数据,其中为

public class MyObject
{
    public string name { get; set; }
}

将属性返回 Json 数据,但我无法修改 MyObject,因为它是从另一个我没有源代码的 DLL 编写的。

非常感谢。

【问题讨论】:

  • 我不确定我是否理解,但你能不能只创建一个与 api 具有相同字段(使用JsonProperty)的对象并将 JSON 反序列化到其中?
  • 是的,我知道我可以创建一个具有所有完全相同字段的对象,但是该类非常大,包含许多字段。我不想复制该类。我知道我可以逐个字段复制,但是有没有简单直接的方法呢?
  • 能否继承类并实现属性并为父类字段赋值?
  • 让我试试,谢谢

标签: c# .net json asp.net-core webapi


【解决方案1】:

您可以使用Newtonsoft Json.Net(开源,MIT 许可证),它将公共属性序列化为字符串化的 JSON 对象。您所要做的就是使用 JsonConvert.SerializeObject 静态方法。

但是您必须对您的操作做一些额外的工作,因为您需要显式返回一个字符串化对象。

public HttpResponseMessage Get()
{
    // initialize your MyObject instance
    var cls = new MyObject
    {
        name = "AAAAA"
    };

    var stringified = JsonConvert.SerializeObject(cls);
    var response = Request.CreateResponse(HttpStatusCode.OK);

    // explicitly return a stringified JSON object
    response.Content = new StringContent(stringified, Encoding.UTF8, "application/json");
    return response;
}

更多关于SO question

【讨论】:

    【解决方案2】:

    不要直接通过您的 webapi 公开该外部对象。

    • 让您的所有模型更接近您的 API 代码,您可以在需要时对其进行更改。 (在您的情况下,您需要在您的 api 项目中创建具有相同属性以及获取和设置的新类)
    • 使用automapper 将外部对象映射到您的 api 模型中(这会让您更轻松)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多