无法将枚举从c#代码生成为json字符串
我正在使用它在我的MVC核心web应用程序中生成动态表单。我在视图模型的以下代码中使用无法将枚举从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
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"}
}