将List <string>从Json反序列化为List <object>

时间:2017-08-02 15:23:10

标签: c# json list serialization

我有以下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中,对象在所有情况下都被序列化为字符串。)

2 个答案:

答案 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