【问题标题】:Prepare custom json format return in MVC c#在MVC c#中准备自定义json格式返回
【发布时间】:2019-11-27 04:16:40
【问题描述】:

我有两个类,即Module 类中的RolesModule 我有两个属性Name,Permission

现在,只是为了测试目的,我正在创建一个演示代码。

类文件

    public class Roles
    {
        public Module[] modules { get; set; }
        public Roles()
        {
            modules = new Module[] { };
        }
    }

    public class Module
    {
        public string Name { get; set; }
        public string[] Permission { get; set; }
    }

控制器代码

public ActionResult Index()
{   
    var oRoles = new Roles();
    oRoles.modules = new Module[] {
        new Module(){
            Name="Page-Profile",
            Permission=new string[]{ "Edit","View","Delete"}
        },
        new Module(){
            Name="User",
            Permission=new string[]{ "Edit","View","Delete","Update"}
        }
    };
    var json = Newtonsoft.Json.JsonConvert.SerializeObject(oRoles);
    return View(json);
}

效果很好,我也得到了结果,但我想要这样的结果。

预期结果。

{
  "modules": [
    {
      "Page-Profile": [
        "Edit",
        "View",        
        "Delete"
      ]
    },
    {
      "User": [
        "Edit",
        "View",
        "Update",
        "Delete"
      ]
    }
  ]
}

目前我得到这样的结果。 is there any way to modify JSON remove all key and get only values.

{
  "modules": [
    {
      "Name": "Page-Profile",
      "Permission": [
        "Edit",
        "View",
        "Delete"
      ]
    },
    {
      "Name": "User",
      "Permission": [
        "Edit",
        "View",
        "Delete",
        "Update"
      ]
    }
  ]
}

注意:如何删除我只想要名称值和名称value 的关键属性,我不想在excpected result 中提到所有permission

【问题讨论】:

    标签: c# json asp.net-mvc


    【解决方案1】:

    它对我有用,试试这个:

    代码

    public class Roles
    {
        public Roles()
        {   
            modules = new List<Dictionary<string, List<string>>>();
        }
    
        public List<Dictionary<string, List<string>>> modules { get; set; }
    }
    
    
    
    /*Index*/
    public ActionResult Index()
    {
        var oRoles = new Roles();   
        var userRolePermissionsAndModulesList =  userRolePermissionManager.GetAllUserRolePermissionsAndModules(userId);
    
        foreach (var module in userRolePermissionsAndModulesList)
        { 
            var objPermissionWithModules = new Dictionary<string, List<string>>();
            var permission = new List<string> { };
    
            if (module.CanCreate)
            permission.Add("Create");
            if (module.CanDelete)
            permission.Add("Delete");
            if (module.CanEdit)
            permission.Add("Update");
            if (module.CanView)
            permission.Add("View");
    
            objPermissionWithModules.Add(module.ModuleName, permission);
            oRoles.modules.Add(objPermissionWithModules);
        } 
    
        var json = Newtonsoft.Json.JsonConvert.SerializeObject(oRoles);
    
        return View(json);
    }
    

    请比较你的输出:

    {
       "modules":[
          {
             "Page-Profile":[
                "Edit",
                "View",
                "Delete"
             ]
          },
          {
             "user":[
                "Edit",
                "View",
                "Delete",
                "Update"
             ]
          }
       ]
    }
    

    【讨论】:

    • 感谢您的回答如何解决多个modules
    • 请查看我在那边提到的答案。
    • 为相同的代码编辑了我的代码,为多个条目添加了一个 foreach,这可能适用于这种情况,请查看
    • 好的,我正在尝试我也做了同样的代码等一下,我会检查并让你现在。
    【解决方案2】:

    删除 Module 类并尝试如下更改 Roles 以获得预期的 json 格式:

        public class Roles
        {
            public Roles()
            {
                modules = new Dictionary<string, List<string>>();
            }
            public Dictionary<string, List<string>> modules { get; set; }
        }
    

    控制器动作代码:

    public ActionResult Index()
    {   
        var oRoles = new Roles();
        oRoles.modules.Add("Page-Profile", new List<string>{"Edit","View","Delete"});
        oRoles.modules.Add("user", new List<string>{"Edit","View","Delete","Update"});
        // Not sure why you are serializing to json. 
        // you can directly return View(oRoles) or PartialView(oRoles)
        var json = Newtonsoft.Json.JsonConvert.SerializeObject(oRoles);
        return View(json);
    }
    

    【讨论】:

    • 谢谢,伙计,它工作得很好 :) 我必须感谢它,兄弟。
    • 虽然它对我有用,但我得到的输出是 { "roles": { "modules": { "23": [ "Edit", "Update" ], "26": [ "Edit", "Update" ], "35": [ "Edit", "Update" ] } } } 但我希望 modulearray object
    • @jishansiddique - 检查我使用自定义JsonConverter 的答案。它将模块输出为数组 --- {"modules":[{"Page-Profile":["Edit","View","Delete"]},{"User":["Edit","View","Delete","Update"]}]}。 Dotnet 小提琴链接 - https://dotnetfiddle.net/Hs3i04
    • @user1672994,是的,目前我正在寻找您的答案。
    【解决方案3】:

    有两种实现方式

    1. 通过编写自定义转换器
    2. 通过更改 Roles 对象

    通过编写自定义转换器

    您可以按如下方式实现 CustomJsonConverter,将名称转换为键并将权限转换为值:

    public class FlatternKeysConverter : JsonConverter
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            Module o = (Module)value;
            JObject newObject = new JObject(new JProperty(o.Name, o.Permission));
            newObject.WriteTo(writer);
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter.");
        }
    
        public override bool CanRead
        {
            get { return false; }
        }
    
        public override bool CanConvert(Type objectType)
        {
            return true;
        }
    }
    

    并将JsonConverter 附加为

    [JsonConverter(typeof(FlatternKeysConverter))]
    public class Module
    {
        public string Name { get; set; }
        public string[] Permission { get; set; }
    }
    

    生成的 JSON 如下:

    {"modules":[{"Page-Profile":["Edit","View","Delete"]},{"User":["Edit","View","Delete","Update"]}]}
    

    通过更改 Roles 对象

    将角色对象更改为字典

    public class Role
    {
        public class Roles
        {
            public Dictionary<string, List<string>> Modules {get; set;}
        }
    }
    

    您可以查看https://dotnetfiddle.net/Hs3i04 dotnet fiddle,它显示了这两种方法。

    【讨论】:

    • 没有custom converter有什么办法可以实现吗?
    • 调用你应该改变对象结构或在不改变结构的情况下实现它。 JsonConverter 提供了一种干净的方法,不需要任何结构更改
    猜你喜欢
    • 2014-09-14
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多