我有以下json字符串作为我的问题的示例:
{
"Code": "Admin",
"Groups":
[
"Administrator",
"Superuser",
"User"
]
}
此外,我还有一个名为User的类,其代码类似于此......
[JsonObject(MemberSerialization.OptIn)]
public class User
{
public User (string code)
{
this.Code = code;
}
[JsonProperty]
public string Code { get; set; }
[JsonProperty("Groups")]
private List<UserGroup> groups;
public List<UserGroup> Groups
{
if (groups == null)
groups = new List<UserGroup>();
return groups;
}
}
...以及一个名为UserGroup的类 - 对于此示例 - 只有这几行代码:
public class UserGroup
{
public UserGroup (string code)
{
this.Code = code;
// Some code to fill all the other properties, just by knowing the code.
}
public string Code { get; set; }
// More properties
}
现在,我想要的是,上面显示的JSON字符串将被反序列化为User的一个实例,并且“Groups”数组中的所有字符串都应该被反序列化为List<UserGroup>
,其中包含来自每个字符串的实例。
另外 - 反过来 - 应该将用户序列化为只包含所包含的UserGroups的Code属性的JSON字符串。
我没有正常反序列化,但是我创建了一个User实例并用这段代码填充...
Newtonsoft.Json.JsonConvert.PopulateObject(jsonString, myUserInstance);
...但如果我使用上面显示的JSON字符串运行代码,我得到的是以下异常:
Newtonsoft.Json.JsonSerializationException: 'Error converting value "Administrator" to type 'UserGroup'.
我的最后要求是,我希望UserGroup
仅在序列化User
时序列化为字符串数组。当我将UserGroup
独立序列化为根对象时,它应该正常序列化(包含所有属性)。 (为了进行比较,在Json.Net: Serialize/Deserialize property as a value, not as an object中,对象在所有情况下都被序列化为字符串。)
答案 0 :(得分:2)
您将不得不为UserGroup
这是一个简单的转换器,基于问题中描述的内容
public class UserGroupJsonConverter : JsonConverter {
public override bool CanConvert(Type objectType) {
return typeof(UserGroup) == objectType;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
return new UserGroup((string)reader.Value);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
writer.WriteValue(((UserGroup)value).Code);
}
}
然后通过设置User
属性的ItemConverterType
来更新JsonProperty
以了解转换器
[JsonObject(MemberSerialization.OptIn)]
public class User {
public User(string code) {
this.Code = code;
}
[JsonProperty]
public string Code { get; set; }
private List<UserGroup> groups;
[JsonProperty("Groups", ItemConverterType = typeof(UserGroupJsonConverter))]
public List<UserGroup> Groups {
get {
if (groups == null)
groups = new List<UserGroup>();
return groups;
}
}
}
这将允许示例中的JSON
{
"Code": "Admin",
"Groups":
[
"Administrator",
"Superuser",
"User"
]
}
根据需要反序列化
var user = JsonConvert.DeserializeObject<User>(json);
并将其序列化为相同的格式。
var json = JsonConvert.SerializeObject(user);
答案 1 :(得分:0)
管理员是一个字符串,UserGroup是一个对象,因此这是一个类型不匹配。代码中列出的场景的有效JSON是:
app.component