我在这里发现了同样的问题…
…但是没有正确的答案。 最好的建议之一是将嵌套对象包装到新类中,但是这种方法引入了另一个问题:乐高名称。 在我的示例中,此类的最逻辑名称是与父类相同的名称,当然这是不可能的。我的示例很简单,我只想消除父类中的“语言”属性。有人可以帮我做吗?
using Newtonsoft.Json; public partial class NamedType { public string Name { get; set; } } public class Proficiency { public string Level { get; set; } public string Name { get; set; } } public class Language { public int Id { get; set; } public string Name { get; set; } //public Language Language { get; set; } //Compiler error //public Language Value { get; set; } //Not correct //public NamedType Language { get; set; } //Compiler error //public NamedType Value { get; set; } //Ugly, isn't? public Proficiency Proficiency { get; set; } } List<Language> languageList = JsonConvert.DeserializeObject<List<Language>>(json);
json的示例:
{ "languages": [ { "id": 1, "language": { "name": "Spanish" }, "proficiency": { "level": "native_or_bilingual", "name": "Native or bilingual proficiency" } }, { "id": 2, "language": { "name": "English" }, "proficiency": { "level": "full_professional", "name": "Full professional proficiency" } }, { "id": 3, "language": { "name": "Japanese" }, "proficiency": { "level": "elementary", "name": "Elementary proficiency" } } ] }
如果JSON属性名称与c#命名约定冲突,则可以在序列化期间使用DataMember或JsonProperty批注替换其他名称。
DataMember
JsonProperty
例如,以下内容可与DataContractJsonSerializerJson.NET一起使用:
DataContractJsonSerializer
[DataContract] public class Language { [DataContract] class NamedType { [DataMember] public string name { get; set; } } [DataContract] class ProficiencyType { [DataMember] public string level { get; set; } [DataMember] public string name { get; set; } } [DataMember(Name="id")] public int Id { get; set; } [IgnoreDataMember] // Do not serialize this property public string Name { get; set; } [IgnoreDataMember] public string ProficiencyLevel { get; set; } [IgnoreDataMember] public string ProficiencyName { get; set; } [DataMember(Name="language")] // serialize this nested class property with name "language" [JsonProperty(ObjectCreationHandling=ObjectCreationHandling.Replace)] // When deserializing, always create a fresh instance instead of reusing the proxy class. NamedType LanguageName { get { return new NamedType { name = Name }; } set { Name = (value == null ? null : value.name); } } [DataMember(Name = "proficiency")] [JsonProperty(ObjectCreationHandling = ObjectCreationHandling.Replace)] ProficiencyType Proficiency { get { return new ProficiencyType { level = ProficiencyLevel, name = ProficiencyName }; } set { ProficiencyLevel = (value == null ? null : value.level); ProficiencyName = (value == null ? null : value.name); } } }
如果发现DataContract属性的选择加入性质令人讨厌,并且希望使用特定于Json.NET的属性,则以下内容等效:
DataContract
public class Language { class NamedType { public string name { get; set; } } class ProficiencyType { public string level { get; set; } public string name { get; set; } } [JsonProperty(PropertyName = "id")] public int Id { get; set; } [JsonIgnore] public string Name { get; set; } [JsonIgnore] public string ProficiencyLevel { get; set; } [JsonIgnore] public string ProficiencyName { get; set; } [JsonProperty(PropertyName = "language", ObjectCreationHandling = ObjectCreationHandling.Replace)] NamedType LanguageName { get { return new NamedType { name = Name }; } set { Name = (value == null ? null : value.name); } } [JsonProperty(PropertyName = "proficiency", ObjectCreationHandling = ObjectCreationHandling.Replace)] ProficiencyType Proficiency { get { return new ProficiencyType { level = ProficiencyLevel, name = ProficiencyName }; } set { ProficiencyLevel = (value == null ? null : value.level); ProficiencyName = (value == null ? null : value.name); } } }