使用JSON.Net反序列化包含字典的字节数组[重复]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用JSON.Net反序列化包含字典的字节数组[重复]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
我面临以下情况。我的一个项目正在抛出一个包含以下对象的事件:
public class MyEvent : BaseEvent
{
public long Id { get; set; }
public Dictionary<string, long> Pairs { get; set; }
}
我收到了这个事件,并在接收器端读取数据为byte []。我必须阅读任何通用事件的当前代码是:
public static T Decode(byte[] data)
{
var serializer = JsonSerializer.Create(new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
});
using (var stream = new MemoryStream(data))
{
using (var sr = new StreamReader(stream, Encoding.UTF8))
{
var jr = new JsonTextReader(sr);
var aux = Encoding.UTF8.GetString(data);
return serializer.Deserialize(jr, typeof(T)) as T;
}
}
}
其中T是我的班级MyEvent。不幸的是抛出的异常是:
无法将当前JSON数组(例如[1,2,3])反序列化为类型'System.Collections.Generic.Dictionary`2 [System.String,System.Int64]',因为该类型需要JSON对象(例如{“name “:”value“})正确反序列化。要修复此错误,请将JSON更改为JSON对象(例如{“name”:“value”})或将反序列化类型更改为数组或实现集合接口的类型(例如ICollection,IList),例如List从JSON数组反序列化。 JsonArrayAttribute也可以添加到类型中以强制它从JSON数组反序列化。路径'OperationTimePairs',第1行,第61位。
我读它的方式是收到的对象没有正确的格式..但是,如果我尝试通过var aux = Encoding.UTF8.GetString(data)读取它;我可以看到结构是正确的。知道我该如何解决这个问题?谢谢!
编辑:
Json示例:
{
"Timestamp":"/Date(1540996292134)/",
"Pairs":[
{
"Key":"first time",
"Value":28
},
{
"Key":"second time",
"Value":30
},
{
"Key":"third time",
"Value":101
},
{
"Key":"operation time",
"Value":231
}
],
"Id":123637
}
我认为你的类与json字符串结构不匹配。
给出以下json字符串:
{
"Timestamp":"/Date(1540996292134)/",
"Pairs":[
{
"Key":"first time",
"Value":28
},
{
"Key":"second time",
"Value":30
},
{
"Key":"third time",
"Value":101
},
{
"Key":"operation time",
"Value":231
}
],
"Id":123637
}
您可以更改模型以匹配json结构,如下所示:
public class MyEvent : BaseEvent
{
public long Id { get; set; }
public List<KeyValuePair<string, long>> Pairs { get; set; }
[JsonIgnore]
public Dictionary<string, long> PairsDictionary
{
get
{
if (Pairs == null)
{
return new Dictionary<string, long>();
}
return Pairs.ToDictionary(pair => pair.Key, pair => pair.Value);
}
}
}
public class BaseEvent
{
public DateTime Timestamp { get; set; }
}
请注意:
- PairsDictionary是基于Pairs的非序列化属性
- 鉴于您没有提供BaseEvent的类定义,我将假设它只有1个属性
测试反序列化:
string json = @"{
""Timestamp"":""/Date(1540996292134)/"",
""Pairs"":[
{
""Key"":""first time"",
""Value"":28
},
{
""Key"":""second time"",
""Value"":30
},
{
""Key"":""third time"",
""Value"":101
},
{
""Key"":""operation time"",
""Value"":231
}
],
""Id"":123637
}";
MyEvent eventData = JsonConvert.DeserializeObject<MyEvent>(json);
或者作为替代(使用泛型):
T data = JsonConvert.DeserializeObject(json, typeof(T)) as T;
以上是关于使用JSON.Net反序列化包含字典的字节数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Json.Net 序列化/反序列化带有自定义键的字典?
如何使用 NewtonSoft Json.Net 将 Json 字典反序列化为平面类
使用 Json.NET 将异构 JSON 数组反序列化为协变 List<>