【问题标题】:JavaScriptSerializer not working with enum when specify assign an index value [duplicate]指定分配索引值时,JavaScriptSerializer 不使用枚举 [重复]
【发布时间】:2018-04-03 23:03:55
【问题描述】:

一个包含枚举属性并使用 JavaScriptSerializer 序列化对象的类。 当我序列化 JSON 时,我得到的是索引值而不是文本。 举个例子:

    public enum LocationType
    {
        [Description("Description 1") ,EnumMember(Value = "EST")]
        EST = 1,
        [Description("Description 2"), EnumMember(Value = "INTNS")]
        INTNS = 2,
        [Description("Description 3"), EnumMember(Value = "INTS")]
        INTS = 3
    }
public class Details
    {
        public LocationType? LocationType { get; set; }
    }

List<Details> obj = new List<Details>();
            obj.Add(new Details() { LocationType = LocationType.INTNS });
            obj.Add(new Details() { LocationType = LocationType.INTS });
            obj.Add(new Details() {  LocationType = LocationType.EST });
            obj.Add(new Details() { LocationType = LocationType.INTS });
            obj.Add(new Details() {  LocationType = LocationType.EST });
            obj.Add(new Details() {  LocationType = LocationType.EST });
            obj.Add(new Details() {  LocationType = LocationType.INTS });
            obj.Add(new Details() {  LocationType = LocationType.EST });

        return obj;

实际json结果:

{ "LocationType ": 2 }

预期的 json 结果:

{ "LocationType ": "INTNS" } 

【问题讨论】:

  • 我不能将 LocationType.INTNS.Value 用于枚举。使用 LocationType.INTNS 时会返回 INTNS
  • 使用 Json.Net 会好很多。这些天,甚至 MS 自己也停止使用 JavaScriptSerialzer,而不是 Json.Net
  • 当我使用 newtonsoft 时,它可以正常工作,但我需要在 javascriptserializer 中实现这种情况

标签: c# asp.net asp.net-mvc serialization javascriptserializer


【解决方案1】:

好的,我刚刚测试过,并且怀疑您为枚举分配了两次值。 如果要将其分配给“字符串”值而不是 int。您不需要将其设置为 int,如文章所示: https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/enumeration-types-in-data-contracts

因此,如果您这样做,它将起作用:

public enum LocationType
{
    [Description("Description 1") ,EnumMember(Value = "EST")]
    EST,
    [Description("Description 2"), EnumMember(Value = "INTNS")]
    INTNS,
    [Description("Description 3"), EnumMember(Value = "INTS")]
    INTS
}

在使用值时,您可能需要在枚举上调用 ToString():

LocationType.INTNS.ToString(); 

【讨论】:

  • 这不是一个合适的解决方案,我们需要相应的索引
  • 当我使用 newtonsoft 时,它可以正常工作,但我需要在 javascriptserializer 中实现这种情况
猜你喜欢
  • 2018-09-16
  • 2012-06-13
  • 2011-12-16
  • 2016-06-20
  • 2021-12-05
  • 2013-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多