你有一个包含短划线的属性名称吗?

时间:2011-04-24 15:58:56

标签: c# json.net

是否可以创建一个具有包含短划线字符的属性名称的对象?

我正在创建一个匿名对象,以便我可以使用Json.Net将其序列化为Json,并且我需要的其中一个属性包含一个' - '破折号字符。

我想要的一个例子是:

var document =  {
    condtions = new {
        acl = "public-read",
        bucket = "s3-bucketname",
        starts-with = "test/path"
    }
};

我知道我可以在创建对象时用下划线替换短划线,然后在序列化字符串中替换它们,但是想知道语言是否有办法在没有这种解决方法的情况下执行此操作。

3 个答案:

答案 0 :(得分:30)

您无法使用匿名对象执行此操作;字段名称必须是有效的标识符。你可以使用一个字典,Json.Net应该像匿名对象一样容易地序列化:

var document = new {
    conditions = new Dictionary<string, string>() {
        { "acl", "public-read" },
        { "bucket", "s3-bucketname" },
        { "starts-with", "test/path" }
    }
};

答案 1 :(得分:23)

不在c#中,没有。但是,大多数序列化程序允许您自定义此选项 - 通常通过属性。 IIRC与JSON.NET,您希望[JsonProperty("starts-with")]指定名称。但是,您不能在匿名类型上使用属性,因此您可能需要使用所需的属性(和属性)定义一个类。

答案 2 :(得分:9)

不幸的是,这是不可能的,因为该语言无法区分以下两个表达式:

condition.starts-with;    // Read "starts-with" property.
condition.starts - with;  // Read "starts" property and subtract "with" variable.