在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[]…
,这似乎是更自然的选择。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);
不使用动态调用,所以无论var
是object
还是dynamic
,它都会编译相同,所以如果你有问题,我的猜测是它在使用dynamic
。
同样的规则也适用于object[]
和dynamic[]
,它们是相同的类型,你可以在它们之间自由地强制转换,当你强制转换时,你只是告诉编译器如何使用该数组中的object
。
dynamic[] dynArr = new object[]{1};
所以答案是任何将反序列化为Dictionary<string,object>
或object[]
的东西都可以用作Dictionary<string,dynamic>
或dynamic[]
本文关键字: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[]…
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);
不使用动态调用,所以无论var
是object
还是dynamic
,它都会编译相同,所以如果你有问题,我的猜测是它在使用dynamic
。
同样的规则也适用于object[]
和dynamic[]
,它们是相同的类型,你可以在它们之间自由地强制转换,当你强制转换时,你只是告诉编译器如何使用该数组中的object
。
dynamic[] dynArr = new object[]{1};
所以答案是任何将反序列化为Dictionary<string,object>
或object[]
的东西都可以用作Dictionary<string,dynamic>
或dynamic[]