当前位置: 首页 > 知识库问答 >
问题:

我如何在我的JSON模型类中使用保留的关键字作为标识符?

孔逸春
2023-03-14

我以前从未使用过Web API,但我需要一个能够接受/返回JSON对象的Web服务,使用它似乎是一件合理的事情。它看起来很简单(如果不是有点过分),但我需要处理的数据结构类似于:

{
    "values":["foo", "bar"],
    "default":"bar"
}

所以我做了一个模型对象:

class DropDownValues {
    public string[] values { get; set; }
    public string default { get; set; }
}

问题是default似乎是一个受保护的关键字。一定有办法绕过这件事,对吧?

共有1个答案

欧阳睿范
2023-03-14

我建议走不同的路。尽可能保持C#对象模型的标准(我不会使用@符号和C#关键字作为属性名)。

我们可以将序列化(JSON)世界和C#对象分开--只需使用JSON.NET特性即可。

其中一个最简单的使用是带有属性的装饰:

[JsonProperty(PropertyName = "default")]
public string DefaultValue { get; set; }

在这种情况下,我们必须在项目中引用NewtonSoft.json。如果必须是POCO,我们可以引入从DefaultContractResolver派生的CustomResolver,并在那里定义这些转换...

但在这种情况下,分离关注是一个更纯粹的解决方案,我会说

编辑:JSON Contract Resolver草案(参见注释)

重要提示:newtonsoft.json是Web API的一部分。它不仅是一个开源的,甚至连MS团队都把它作为一个核心的JSON序列化器。

1)newtonsoft.json(作为web.api的一部分)已经安装在您的解决方案中。因此您不必单独下载(nuget)。它将始终位于packages文件夹中。因此,使用该属性只是添加引用。它就在那里...

2)这里有一个小的草案,如何做属性的东西,同时保持POCO。正如我在这里试着解释的:POCO的,行为和periospance Igorance,以保持POCO(例如。我们确实从数据层上的NHibernate的分层体系结构中获益),我们可以用契约解析器替换属性。我们的POCO库不必引用任何东西

我们只需要扩展服务层:

public class MyResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(
         MemberInfo member,
         MemberSerialization memberSerialization)
    {

        var jProperty = base.CreateProperty(member, memberSerialization);

        var propertyInfo = member as PropertyInfo;
        if (propertyInfo == null)
        {
            return jProperty;
        }

        // just adjust in case if Property name is DefaultValue
        var isDefaultValueProeprty =
                  propertyInfo.Name.Equals("DefaultValue");

        if(isDefaultValueProeprty)
        {
            jProperty.PropertyName = "default";
        }

        return jProperty;
    }
    ...

通过这种方式,我们向serailizer提供了与[JsonPropertyAttribute]相同的信息。

现在,我们只要用它就行了。有很多种方法(例如全局),但我们只能针对一个控制器:

protected override void Initialize(HttpControllerContext context)
{
  base.Initialize(context);

  var jSettings = context.Configuration.Formatters.JsonFormatter.SerializerSettings;
  jSettings.ContractResolver = MyResolver;
}
 类似资料:
  • 我一直在用C语言,用clang编译。我想包括 不幸的是,这个标题对一些字段名(比如第727行)使用了,这是C语言中的一个关键字。 有没有办法解决这个问题? xcb/xkb. h:

  • 问题内容: 我有一个名为“ Group”的实体类,NetBeans警告我“实体表名称是保留的Java Persistence QL关键字”。 类似的情况是使用保留的SQL关键字。 这个名字会被转义吗?使用其他表名可以解决@Table(name =“ otherName”)的问题。还是应该重命名课程? 问题答案: 这个名字会被转义吗? 有 没有 在JPA规范是这么说的,如果您的提供商做,这是供应商特

  • 问题内容: 有什么技巧可以将Java保留字用作变量,方法,类,接口,包或枚举常量名称? 问题答案: 不,没有办法。这就是为什么它们被标记为“保留”的原因。

  • 问题内容: 我有一个简单的问题: 在Java编译器中,可以将哪种类型的方法或变量定义为标识符(ID)或关键字(保留字)? 对于下面的例子中,ID应该是:,,,,,,怎么样,是一个ID或关键字? 例: 问题答案: 一个 标识符 是用于由程序员,仅举一个字 变量,方法,类,或标签 。 您在Java程序中的任何一个 在您上面的程序中不是,您可以将print用作 使用print作为标识符后,您的代码如下所

  • 我有以下问题:我正在为GLSL着色语言创建一个编辑器。我希望在某些情况下允许关键字作为标识符,因为内置函数的名称可以用作标识符。 例如: 和不被识别为标识符。 完整语法供参考:http://paste2.org/YwDNkBYW 解决方案: 我创建了一个包含所有内置函数的源文件: 我使用保留的关键字来区分内置函数和本地创建的函数: ...在ScopeProvider中添加了以下内容: 在中,我在迭

  • 问题内容: 保留哪些JavaScript关键字(函数名称,变量等)? 问题答案: 其中包含JavaScript中所有保留的关键字,专门针对那些当下保持诚实,而不仅仅是尝试得分的人: