我正在为“写作”写一些东西,这就是我得到的回应:
{ "clientID" : "shard2:jgv1dnwhyffmld7kir5drlcwp7k6eu",
"events" : [ [ "waiting" ],
[ "statusInfo",
{ "antinudepercent" : 1.0,
"antinudeservers" : [ "waw1.omegle.com",
"waw2.omegle.com",
"waw3.omegle.com"
],
"count" : 28477,
"servers" : [ "front1.omegle.com",
"front8.omegle.com",
"front7.omegle.com",
"front9.omegle.com",
"front2.omegle.com",
"front5.omegle.com",
"front3.omegle.com",
"front6.omegle.com",
"front4.omegle.com"
],
"spyQueueTime" : 0.000099992752075199996,
"spyeeQueueTime" : 0.8086000442504,
"timestamp" : 1375197484.3550739
}
]
]
}
要将这些数据放入字典中,我尝试使用以下函数:
private Dictionary<string, object> deserializeToDictionary(string jo)
{
Dictionary<string, object> values = JsonConvert.DeserializeObject<Dictionary<string, object>>(jo);
Dictionary<string, object> values2 = new Dictionary<string, object>();
foreach (KeyValuePair<string, object> d in values)
{
if (d.Value.GetType().FullName.Contains("Newtonsoft.Json.Linq.JObject"))
{
values2.Add(d.Key, deserializeToDictionary(d.Value.ToString()));
}
else
{
values2.Add(d.Key, d.Value);
}
}
return values2;
}
但是,我收到以下错误:
无法将当前JSON数组(例如[1,2,3])反序列化为类型 'System.Collections.Generic.Dictionary2 [System.String,System.Object的]' 因为类型需要一个JSON对象(例如{“name”:“value”})来 正确地反序列化。
要修复此错误,请将JSON更改为JSON对象(例如 {“name”:“value”})或将反序列化类型更改为数组或a 实现集合接口的类型(例如ICollection,IList) 像可以从JSON数组反序列化的List。 JsonArrayAttribute也可以添加到类型中以强制它 从JSON数组反序列化。
我做错了什么?
答案 0 :(得分:4)
您的问题“我为什么会收到此错误”的简短回答是您的JSON是JSON对象和数组的混合,但您的代码似乎正在尝试将所有内容反序列化为字典。 Json.Net无法将数组反序列化为字典,因此会抛出此错误。反序列化时,必须确保将JSON对象与.NET对象(或字典)和JSON数组匹配到.NET数组(或列表)。
那么,我们如何让事情发挥作用?好吧,如果你只想要一个可以处理任意JSON并将其转换为常规.NET类型(原语,列表和字典)的泛型函数,那么你可以使用JSON.Net的Linq-to-JSON API来做这样的事情: / p>
private static object Deserialize(string json)
{
return ToObject(JToken.Parse(json));
}
private static object ToObject(JToken token)
{
if (token.Type == JTokenType.Object)
{
Dictionary<string, object> dict = new Dictionary<string, object>();
foreach (JProperty prop in ((JObject)token).Properties())
{
dict.Add(prop.Name, ToObject(prop.Value));
}
return dict;
}
else if (token.Type == JTokenType.Array)
{
List<object> list = new List<object>();
foreach (JToken value in token.Values())
{
list.Add(ToObject(value));
}
return list;
}
else
{
return ((JValue)token).Value;
}
}
另一方面,为什么要解决所有麻烦,当你可以把所有东西都保存为JObjects和JArrays并使用API直接找到你想要的东西?例如,如果要获取所有事件名称,可以执行以下操作:
var events = JObject.Parse(json)["events"];
var eventNames = events.Select(a => a[0].Value<string>()).ToList();
如果您想获取所有“gotMessage”事件的所有消息,您可以这样做:
var messages = events.Where(a => a[0].Value<string>() == "gotMessage")
.Select(a => a[1].Value<string>())
.ToList();
Discalimer:我一点都不熟悉“聊天”或其API,所以我只是猜测JSON的格式是基于你的问题和评论。我也不确切知道您感兴趣的数据,因此您几乎肯定需要进行调整以满足您的需求。希望这些例子足以让你“脱离”。我还建议在文档中查看Linq-to-JSON samples。