Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法将枚举从c#代码生成为json字符串_C#_Json_Asp.net Core_System.text.json - Fatal编程技术网

无法将枚举从c#代码生成为json字符串

无法将枚举从c#代码生成为json字符串,c#,json,asp.net-core,system.text.json,C#,Json,Asp.net Core,System.text.json,我正在使用它在我的MVC核心web应用程序中生成动态表单。我在视图模型的以下代码中使用System.Text.Json.JsonSerializer.Serialize,以生成一个简单的单字段表单。我的目标是最终将这个json存储在数据库中并从那里检索它 public TestsViewModel GetFormControls1() { var myJsonModel = new { schema

我正在使用它在我的MVC核心web应用程序中生成动态表单。我在视图模型的以下代码中使用
System.Text.Json.JsonSerializer.Serialize
,以生成一个简单的单字段表单。我的目标是最终将这个json存储在数据库中并从那里检索它

 public TestsViewModel GetFormControls1()
        {
            var myJsonModel = new
            {
                schema = new
                {
                    client = new
                    {
                        type = "object",
                        title = "Client",
                        properties = new
                        {
                            forename = new
                            {
                                type = "string",
                                title = "Forename",
                                minLength = 3,
                                maxLength = 10,
                            }
                        }
                    }
                },
                form = new List<Object>
                {
                    new {
                        key = "client.forename",
                        title = "Forename"
                    }
                },
                value = new
                {
                    client = new
                    {
                        forename = "",
                    }
                }
            };

            TestsViewModel homeVm = new TestsViewModel();
            homeVm.FormControls = System.Text.Json.JsonSerializer.Serialize(myJsonModel);
            return homeVm;
        }

我现在需要为我的json生成一个枚举,以便在表单中显示一个用于选择性别的下拉列表。但是,我无法通过c#代码实现这一点。有人能帮忙吗?我希望我的c#代码生成以下json(注意模式和表单中的两个性别条目)

我试过使用下面的代码,但是
enum
是c#中的一个关键字,所以我得到了一个错误

gender = new
                            {
                                type = "string",
                                title = "Gender",
                                enum = "[male, female, alien]"
                            }
另外
Enum=“[male,female,alien]”
生成
“Enum:“[male,female,alien]”
而不是
“Enum:[“male”,“female”,“alien”]

我有一个性别查找表,我最终会用它生成上面的枚举,所以任何关于它的想法都会很有帮助

更新 @dbc的评论为我的大部分问题提供了解决方案。然而,如果我试图将字符串映射到int,我仍然在努力生成titleMapJSON

var gender3 = new
            {
                type = "string",
                title = "Gender",
                titleMap = new List<string> { new string("1" + ":" + "Male"), new string("2" + ":" + "Female")}
            };
但是,我需要在{}内的双引号中同时使用1和Male,而不是如下所示的[]

{
  "type": "string",
  "title": "Gender",
  "titleMap": {
    "1": "Male",
    "2": "Female"
  }
}

据我所知,您正在尝试将枚举值数组作为其文本名序列化为JSON。最简单的解决方案是向
TestViewModel
添加一个数组或枚举属性列表,并使用转换器将它们序列化为字符串而不是数字

下面是一个例子,说明你如何实现你所追求的目标

假设您有一些带有一组值的枚举:

//This is an arbitrary enum, this could be 'Gender', in your case
public enum TestEnum
{
    value1,
    value2,
    value3,
    value4,
}
您需要写下这些枚举值的数组。将枚举属性列表(或枚举数组)添加到模型中。如果您希望JSON中的属性名是保留字之一(如
enum
),请使用属性覆盖该名称(并以编程方式保留最有意义的名称):

现在,这就是您的代码在以下方面的外观:


据我所知,您正在尝试将枚举值数组作为其文本名序列化为JSON。最简单的解决方案是向
TestViewModel
添加一个数组或枚举属性列表,并使用转换器将它们序列化为字符串而不是数字

下面是一个例子,说明你如何实现你所追求的目标

假设您有一些带有一组值的枚举:

//This is an arbitrary enum, this could be 'Gender', in your case
public enum TestEnum
{
    value1,
    value2,
    value3,
    value4,
}
您需要写下这些枚举值的数组。将枚举属性列表(或枚举数组)添加到模型中。如果您希望JSON中的属性名是保留字之一(如
enum
),请使用属性覆盖该名称(并以编程方式保留最有意义的名称):

现在,这就是您的代码在以下方面的外观:

enum是C#中的一个关键字,因此需要在enum前面加上@

gender = new
                            {
                                type = "string",
                                title = "Gender",
                                @enum = new string[3]{"male", "female", "alien"}
                            }
enum是C#中的一个关键字,因此需要在enum前面加上@

gender = new
                            {
                                type = "string",
                                title = "Gender",
                                @enum = new string[3]{"male", "female", "alien"}
                            }

你的问题很长,但你只是在寻找
@enum=new[]{“男”、“女”、“外星人”},
?看见请参阅:以及字符串数组的数组初始值设定项语法。@dbc这解决了我的大多数查询。请参阅上面的更新部分了解剩余问题。另外,请将您的评论添加到回答部分,以便我可以接受。您的问题很长,但您只是在寻找
@enum=new[]{“男”、“女”、“外星人”},
?看见请参阅:以及字符串数组的数组初始值设定项语法。@dbc这解决了我的大多数查询。请参阅上面的更新部分了解剩余问题。也可以把你的评论添加到回答部分,这样我就可以接受了。这就解决了关键词问题,谢谢。但是,它生成的是
“enum”:“[男性、女性、外国人]”
而不是“
”enum:[“男性”、“女性”、“外国人”]
@dbc注释显示我需要的内容。在这种情况下,您可以将其作为数组。我用一个数组更新了我的答案。你建议我如何解决关于标题地图的问题的第二部分,请参阅问题的更新部分?使用字典这解决了关键字问题,谢谢。但是,它生成的是
“enum”:“[男性、女性、外国人]”
而不是“
”enum:[“男性”、“女性”、“外国人”]
@dbc注释显示我需要的内容。在这种情况下,您可以将其作为数组。我用一个数组更新了我的答案。你建议我如何解决关于标题地图的问题的第二部分,请参阅问题的更新部分?请使用字典库,但请参阅@dbc comments为我提供了最简单的解决方案。谢谢你的努力,但请参阅@dbc comments为我提供了最简单的解决方案。
public class TestsViewModel_Option1
{
    // In your case, this property could be called 'Genders' to be self-documenting
    [JsonPropertyName("enum")]
    public List<TestEnum> ListOfEnums { get; set; }
}
public class TestsViewModel_Option2
{
    // Or use fixed-size array, TestEnum[], if needed
    public List<TestEnum> @enum { get; set; }
}
private static void SerializeListOfEnums()
{
    var model1 = new TestsViewModel_Option1
    {
        ListOfEnums = { TestEnum.value1, TestEnum.value3 }
    };

    var options = new JsonSerializerOptions
    {
        Converters = { new JsonStringEnumConverter() }
    };

    // {"enum":["value1","value3"]}
    Console.WriteLine(JsonSerializer.Serialize(model1, options));

    var model2 = new TestsViewModel_Option2
    {
        @enum = { TestEnum.value1, TestEnum.value3 }
    };

    // {"enum":["value1","value3"]}
    Console.WriteLine(JsonSerializer.Serialize(model2, options));
}
gender = new
                            {
                                type = "string",
                                title = "Gender",
                                @enum = new string[3]{"male", "female", "alien"}
                            }