在c# .Net 4.0+中是否有JSON序列化器可以将JSON序列化为Dictionary

本文关键字:JSON 序列化 Dictionary dynami string 是否 Net | 更新日期: 2023-09-27 18:08:34

我知道您可以将JSON序列化到Dictionary和object[],但问题是它需要您不断地在各处强制转换内容:

using System.Web.Script.Serialization;
var json = new JavaScriptSerializer { }.DeserializeObject(@"{array:['item1','item2']}") as Dictionary<string, object>;
var strings = new List<string> { };
if (json != null)
{
    var array = json["array"] as object[];
    if (array != null)
    {
        foreach (var item in array.Select(i=>i as string))
        {
            if (!string.IsNullOrWhiteSpace(item))
            {
                strings.Add(item);
            }
        }
    }
}
return strings.ToArray();

我更愿意这样做:

try
{
    var json = new JavaScriptSerializer { }.DeserializeDynamic(@"{array:['item1','item2']}") as Dictionary<string, dynamic>;
    var strings = new List<string>{};
    foreach (var item in json["array"])
        strings.Add(item as string);
    return strings.ToArray();
}
catch { return null; }

我遇到的问题与对象[]和数字类型,我从来没有确定如果它将是一个int, float, decimal,或双精度等。我无法清理json数据,所以它只能是一个可靠的双精度数据…

是否有。net 4.0的JSON序列化器输出字典和动态[]?比起Dictionary和object[]…

在c# .Net 4.0+中是否有JSON序列化器可以将JSON序列化为Dictionary<string,dynami

,这似乎是更自然的选择。

JSON。. NET应该处理您的需求(使用Json. NET)。. NET动态扩展)

就运行时间而言,Dictionary<string, object>Dictionary<string, dynamic>是相同的类型。

例如:

var dynDic =new Dictionary<string,object>{ {"test", 1}}
                    as Dictionary<string,dynamic>;
int value = dynDic["test"];

所以如果你的第一个工作:

var json = new JavaScriptSerializer { }
         .DeserializeObject(@"{array:['item1','item2']}") 
         as Dictionary<string, object>;

then so should:

var json = new JavaScriptSerializer { }
         .DeserializeDynamic(@"{array:['item1','item2']}")
         as Dictionary<string, dynamic>;

但是:

foreach (var item in json["array"])
    strings.Add(item as string);

不使用动态调用,所以无论varobject还是dynamic,它都会编译相同,所以如果你有问题,我的猜测是它在使用dynamic

同样的规则也适用于object[]dynamic[],它们是相同的类型,你可以在它们之间自由地强制转换,当你强制转换时,你只是告诉编译器如何使用该数组中的object

dynamic[] dynArr = new object[]{1};

所以答案是任何将反序列化为Dictionary<string,object>object[]的东西都可以用作Dictionary<string,dynamic>dynamic[]