反序列化JSON以适合模型

时间:2018-10-16 17:26:31

标签: c# json json.net

我的JSON字符串如下所示:

"[{\r\n\t'variable1': [{0:'somename'}],\r\n\r\n\t'variable2': 'xxx'\r\n}]"

我想反序列化此JSON字符串,使其适合我的Model,如下所示:

    public string variable2 { get; set; }
    public List<KeyValuePair<int, string>> variable1 { get; set; }

但是,array字符串的variable1部分(JSON)不会反序列化。它检测到int,但是未检测到字符串'somename'。它只是显示为空。

我该如何解决?

注意:我正在使用Newtonsoft.Json

3 个答案:

答案 0 :(得分:1)

解析此json的简便方法如下:

[Fact]
public void ShouldParseClass()
{
    var result = JsonConvert.DeserializeObject<List<SOClass>>("[{\r\n\t'variable1': [{0:'somename'}],\r\n\r\n\t'variable2': 'xxx'\r\n}]");
    Assert.True(result.First().variable1[0]["0"] == "somename");
}
public class SOClass
{
    public string variable2 { get; set; }
    public List<dynamic> variable1 { get; set; }
}

您的Json中的主要问题是varible1正在获得列表。所有值都应在同一对象上,以作为字典。 在另一方面,如果您想要一个KeyValuePair列表,则应该像{'key':0,'value':'somename'}这样传递这些项目。

答案 1 :(得分:0)

这可能取决于您用来反序列化JSON的库。如果您使用的是Newtonsoft.Json,我还建议将List<KeyValuePair<int, string>>更改为Dictionary<int, string>,这样做可能会解决反序列化问题。

答案 2 :(得分:0)

如果您无法控制json,则应定义一个自定义转换器:

public class Data
{
    public string variable2 { get; set; }

    // pick one: dictionart should be favored, unless you have no-unique keys

//  [JsonConverter(typeof(CustomListKvpConverter<int, string>))]
//  public List<KeyValuePair<int, string>> variable1 { get; set; }
//
//  [JsonConverter(typeof(CustomDictionaryKvpConverter<int, string>))]
//  public Dictionary<int, string> variable1 { get; set; }
}

public class CustomListKvpConverter<TKey, TValue> : JsonConverter<List<KeyValuePair<TKey, TValue>>>
{
    public override List<KeyValuePair<TKey, TValue>> ReadJson(JsonReader reader, Type objectType, List<KeyValuePair<TKey, TValue>> existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        return JArray.Load(reader)
            .ToObject<Dictionary<TKey, TValue>[]>()
            .SelectMany(x => x)
            .ToList();
    }

    public override void WriteJson(JsonWriter writer, List<KeyValuePair<TKey, TValue>> value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}
public class CustomDictionaryKvpConverter<TKey, TValue> : JsonConverter<Dictionary<TKey, TValue>>
{
    public override Dictionary<TKey, TValue> ReadJson(JsonReader reader, Type objectType, Dictionary<TKey, TValue> existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        return JArray.Load(reader)
            .ToObject<Dictionary<TKey, TValue>[]>()
            .SelectMany(x => x)
            .ToDictionary(x => x.Key, x => x.Value);
    }

    public override void WriteJson(JsonWriter writer, Dictionary<TKey, TValue> value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}