将json字符串数组反序列化为字符串数组



假设我有以下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属性的类型为objectdynamic。然而,如果你走这条路,那么不幸的是,你将不得不处理这种未知类型的问题。我对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);

相关内容

  • 没有找到相关文章

最新更新