假设我有以下JSON对象:
{
"Key": ""QTuY+0m31w2QiZGl4h+W8w=="",
"Value":
[
"addgroup",
"viewgroup",
"editgroup"
]
}
如何在C#string[]
中反序列化Value
部分?
问题是,string[]
并不是我在Value
部分中拥有的唯一类型,它可以是所有类型,所以我需要使用dynamic。
我使用的是JSON.net,当我使用JsonConvert.DeserializeObject
方法时,我会得到一个运行时绑定器异常。
这是我用来反序列化的方法:
public async Task<Tuple<string, dynamic>> ReadCachingEntryAsync(string uri) {
var data = tools.ReadEntry(Path.Combine(cacheFolder, uri.Replace("/", "")));
var res = new Tuple<string, dynamic>(string.Empty, null);
if (data != null) {
var dat = JsonConvert.DeserializeObject<KeyValuePair<string, dynamic>>(UTF8Encoding.UTF8.GetString(data));
res = new Tuple<string, dynamic>(dat.Key, dat.Value);
}
return res;
}
tools.ReadEntry(data)
从二进制格式化文件返回包含数据的byte[]
。
这是KeyValuePair<K, V>
类
[Serializable]
internal struct KeyValuePair<K, V> {
public K Key { get; set; }
public V Value { get; set; }
}
只需调用DeserializeObject<T>
,将T
替换为要将输入字符串反序列化为和json的类型。NET会处理剩下的。
string[] json = JsonConvert.DeserializeObject<string[]>(inputString);
编辑:
好吧,假设你所有的json都是EDIT 3中发布的示例的形式,那么你真正想要的是什么;
public class KVPair
{
public string Key { get; set; }
public string[] Value { get; set; }
}
KVPair pair = JsonConvert.DeserializeObject<KVPair>(UTF8Encoding.UTF8.GetString(data));
现在这是相当静态的,但我不确定你是否真的需要动态。如果执行此操作,则会希望Value
属性的类型为object
或dynamic
。然而,如果你走这条路,那么不幸的是,你将不得不处理这种未知类型的问题。我对dynamic
类型真的不了解,所以我不能评论以后如何处理它,但如果说,例如,数组可以包含、int、float或字符串,并且您制作了object
类型的Value
,那么您必须在以后检查数组,确定基础类型,并将每个项强制转换为该类型,然后才能对它们执行任何有用的操作。希望能有所帮助。如果你幸运的话,你可以使用我上面发布的代码,因为它要简单得多,而且实际上是类型安全的。
您可以检查它是否是JArray
并实现特殊处理。例如
byte[] data = Encoding.UTF8.GetBytes(@"{""Key"": ""Something"", ""Value"": [""test"", ""test 2"", ""test 3""]}");
var dat = JsonConvert.DeserializeObject<KeyValuePair<string, dynamic>>(UTF8Encoding.UTF8.GetString(data));
var value = dat.Value;
if (value is JArray)
{
var arrayType = value[0].Value.GetType().MakeArrayType();
value = value.ToObject(arrayType);
}
var res = new Tuple<string, dynamic>(dat.Key, value);