最近我在课堂上面对json对象名称声明,并且能够通过以下方式解决它:
[JsonProperty("flv-270p")]
public string flv270p { get; set; }
所以如果我想在不使用JsonProperty的情况下声明flv-270p,我该怎么做?
喜欢:
public string flv270-p { get; set; }
答案 0 :(得分:6)
你不能:
有效名称定义为:
identifier:
available-identifier
@ identifier-or-keyword
available-identifier:
An identifier-or-keyword that is not a keyword
identifier-or-keyword:
identifier-start-character identifier-part-charactersopt
identifier-start-character:
letter-character
_ (the underscore character U+005F)
identifier-part-characters:
identifier-part-character
identifier-part-characters identifier-part-character
identifier-part-character:
letter-character
decimal-digit-character
connecting-character
combining-character
formatting-character
letter-character:
A Unicode character of classes Lu, Ll, Lt, Lm, Lo, or Nl
A unicode-escape-sequence representing a character of classes Lu, Ll, Lt, Lm, Lo, or Nl
combining-character:
A Unicode character of classes Mn or Mc
A unicode-escape-sequence representing a character of classes Mn or Mc
decimal-digit-character:
A Unicode character of the class Nd
A unicode-escape-sequence representing a character of the class Nd
connecting-character:
A Unicode character of the class Pc
A unicode-escape-sequence representing a character of the class Pc
formatting-character:
A Unicode character of the class Cf
A unicode-escape-sequence representing a character of the class Cf
Hyphen-minus属于Pd类,因此上述情况不允许。
这确实是为什么在名称中允许使用类Pd的原因之一是个坏主意:
int x-y = 3;
int x = 10;
int y = 2;
int z = x-y; //3 or 8? Impossible to tell if the first line were allowed.
答案 1 :(得分:5)
简短回答:你不能。
.NET支持任意成员名称,包括那些在CIL语言中非法的成员名称。但是,如果某种语言不支持它,那么您就无法使用它,这包括连字符和破折号。因此,C#中的自动属性在其隐藏的支持字段名称中使用<
和>
。
C#允许您使用@
符号作为前缀,以允许您将其用作变量或成员名称(例如public int @class
或public void @struct(int @interface)
,但这是为了消费者的利益
但是,在任何情况下,c#都不允许在名称中使用连字符,因为该字符用于一元否定和二元减法子运算符。名称flv270-p
被解释为“flv270
减去p
”。
答案 2 :(得分:3)
实际上你可以使用像这样的代码
public string flv270_p { get; set; }
并返回重新格式化的类,替换&#34; - &#34;用&#34; _&#34;。
例如, 如果你有这个,
var jsonstring = ApiRequest.DoRequest(ApiRequest.GetBaseUriFor(typeof(SMS), "/sms/json"), new Dictionary<string, string>()
{
{"from", request.from},
{"to", request.to},
{"text", request.text}
});
return JsonConvert.DeserializeObject<SMSResponse>(jsonstring);
这样做,
var jsonstring = ApiRequest.DoRequest(ApiRequest.GetBaseUriFor(typeof(SMS), "/sms/json"), new Dictionary<string, string>()
{
{"from", request.from},
{"to", request.to},
{"text", request.text}
}).Replace("-","_");
return JsonConvert.DeserializeObject<SMSResponse>(jsonstring);
答案 3 :(得分:1)
flv-270p
不是C#中的有效变量名。每当你在代码中输入类似的东西时,编译器都认为你试图做“flv270减去p”:)
答案 4 :(得分:1)
其他答案给出了一个很好的解释,说明为什么你不能做exac你要求的。话虽这么说,我遇到了一些情况,我希望我的对象元数据有连字符,以便制定针对SEO优化的描述性URL。您在问题中使用的属性方法有效,但您也可以使用约定来指示这种没有属性的自定义。一个建议是预处理成员名称以使用PascalCase并在单词之间插入连字符分隔符。这可能会导致过多的元数据更改。另一种选择是使用下划线'_',它是C#名称中的合法字符,并在预处理中用连字符替换下划线。您的问题并没有真正说明您的用例,以说明如何在元数据上下文中实现/注入,但希望这些想法在您设计api时很有用。