我的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
答案 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();
}
}