是否有一种平衡的方法可以使用单个类序列化c#中的2级对象?

是否有一种平衡的方法可以使用单个类序列化c#中的2级对象?,c#,.net,asp.net-core,C#,.net,Asp.net Core,我需要以这种方式从控制器输出json结果:{x:{myProp1:false,myProp2:“xx”} 我希望传递给Json(obj)的对象是没有嵌套类的类的实例。 是否有任何方法可以创建一个类MyResult,该类将生成我想要的结果,而不创建包装器独立类或对象 我要所有的: 为了能够生成正确的响应,调用返回Json(new MyResult()) 将MyResult类保留为单个文件中的单个类 没有过度的工程设计 寻找做这件事的最佳方式 当前代码: [Serializable] class

我需要以这种方式从控制器输出json结果:
{x:{myProp1:false,myProp2:“xx”}
我希望传递给
Json(obj)
的对象是没有嵌套类的类的实例。 是否有任何方法可以创建一个类
MyResult
,该类将生成我想要的结果,而不创建包装器独立类或对象

我要所有的:

  • 为了能够生成正确的响应,调用
    返回Json(new MyResult())
  • MyResult
    类保留为单个文件中的单个类
  • 没有过度的工程设计
寻找做这件事的最佳方式

当前代码:

[Serializable]
class MyResult{
    [JsonPropertyName("myProp1")]
    public bool Property1 {get; init;} = false; 
    [JsonPropertyName("myProp2")]
    public string Property2 {get; init;} = "xx";

    public MyResult(bool p1 = true, string p2 = "xx") {
        Property1 = p1;
        Property2 = p2;
    }
}

...


public class MyController : Controller

    [AllowAnonymous]
    [HttpGet("GetMyResult")]
    [Produces("application/json")]
    public IActionResult GetMyResult() {
        return Json(new {x = new MyResult()}); // I want this to be return Json(new MyResult());
    }
  • ✅ 能够生成调用return Json(new MyResult())的正确响应
  • ✅ 将MyResult类保留为单个文件中的单个类
  • ✅ 没有过度的工程设计
  • ✅ 能够生成调用return Json(new MyResult())的正确响应
  • ✅ 将MyResult类保留为单个文件中的单个类
  • ✅ 没有过度的工程设计

“最好的方法”——将是一件非常固执己见的事情。我想说的是,您当前的版本相当不错。没有什么可以阻止您使用
返回Json(new MyResult())
。另一方面,您想要的JSON非常不同。问题不在于匿名类型。它试图使用
MyResult
来表示一个非常不同的对象尽管您不喜欢它,但您对
Json(新x{…})
的实际问题是什么?@filimonic这不是一个包装器。那是另一个物体。您要求的是转换,而不是序列化。最简单的方法是创建一个与您想要的负载实际匹配的DTO。当您试图从与有效负载不匹配的
MyResult
创建一个招摇过市的文档时会发生什么?之后,匿名类型是快速和肮脏的方式。如果您确实想强制序列化程序以某种方式工作,则需要一个自定义类型转换器。那是过度工程化了though@filimonic
我想要一些类似于内部的easy nested struct的东西,
创建一个适当的数据,然后
类ResultDTO{public MyResult x{get;set;}“这样做的最佳方式”-将是一件相当固执己见的事情。我想说的是,您当前的版本相当不错。没有什么可以阻止您使用
返回Json(new MyResult())
。另一方面,您想要的JSON非常不同。问题不在于匿名类型。它试图使用
MyResult
来表示一个非常不同的对象尽管您不喜欢它,但您对
Json(新x{…})
的实际问题是什么?@filimonic这不是一个包装器。那是另一个物体。您要求的是转换,而不是序列化。最简单的方法是创建一个与您想要的负载实际匹配的DTO。当您试图从与有效负载不匹配的
MyResult
创建一个招摇过市的文档时会发生什么?之后,匿名类型是快速和肮脏的方式。如果您确实想强制序列化程序以某种方式工作,则需要一个自定义类型转换器。那是过度工程化了though@filimonic
我想要一些类似于内部的easy nested struct的东西,
创建一个适当的数据,然后
类ResultDTO{public MyResult x{get;set;}
[AllowAnonymous]
[HttpGet]
[Produces("application/json")]
public IActionResult GetMyResult()
{
    return Json(new MyResult()); 
}

public override JsonResult Json(object data) 
    => new JsonResult( new { x = data });