我从第三方API获取这样的JSON数据,我无法更改:
{"ts":1234567890,"updates":[[4,104482,8209,2000000007,1462994403,"some text","some text again",{"from":"1337"}],[80,7,0],[7,2000000007,104481],[62,76706856,7]]}
我尝试使用此代码对其进行反序列化:
public class LongpollData
{
public ulong Ts { get; set; }
public List<Tuple<ApiEvent, int, ApiMask, ulong?, ulong?, string, string, FromInfo>> Updates { get; set; }
public class FromInfo
{
string From { get; set; }
}
public enum ApiEvent
{
delete = 0,
replace = 1,
setMessageFlags = 2,
resetMessageFlags = 3,
newMessage = 4,
readAllIn = 6,
readAllOut = 7,
friendIsOnline = 8,
friendIsOffline = 9,
chatChanged = 51,
userIsTyping = 61,
userIsTypingIn = 62,
userMadeCall = 70,
unreadMessagesCount = 80,
notificationSettingsChanged = 144,
}
[Flags]
public enum ApiMask
{
UNREAD = 1,
OUTBOX = 2,
REPLIED = 4,
IMPORTANT = 8,
CHAT = 16,
FRIENDS = 32,
SPAM = 64,
DELЕTЕD = 128,
FIXED = 256,
MEDIA = 512,
}
}
...
var UpdateData = JsonConvert.DeserializeObject<LongpollData>(webData);
但是我得到了一个例外:
无法将当前JSON数组(例如[1,2,3])反序列化为类型System.Tuple
8[VkKonekoBot.vkLongpollEvents+LongpollData+ApiEvent,System.Int32,VkKonekoBot.vkLongpollEvents+LongpollData+ApiMask,System.Nullable
1 [System.UInt64],System.Nullable`1 [System.UInt64] ,System.String,System.String,VkKonekoBot.vkLongpollEvents + LongpollData + FromInfo]&#39;因为类型需要一个JSON对象(例如{\&#34; name \&#34;:\&#34; value \&#34;})才能正确反序列化。\ r \ n要修复此错误要么更改JSON到JSON对象(例如{\&#34; name \&#34;:\&#34; value \&#34;})或将反序列化类型更改为实现集合接口的数组或类型(例如ICollection,IList)就像可以从JSON数组反序列化的List。 JsonArrayAttribute也可以添加到类型中以强制它从JSON数组反序列化。\ r \ n路径&#39;更新[0]&#39;,第1行,第29位。
我做错了什么?
答案 0 :(得分:0)
正如Gusman所述,在评论中,此处唯一的直接选项是将updates
字段反序列化为object[][]
。作为第一步,至少将数据转换为可以操作的表单。
例如,您可以反序列化到此类中:
class temp
{
public long ts;
public object[][] updates;
}
从那里你需要有一些方法来从这些数组创建Tuple
或其他类型的实例。对于文本和数字,转换就像取消装箱值一样简单,对于您需要处理{"from":"1337"}
的复杂类型(JSObject
)或将其转换回JSON并重新开始。
不简单。
您也可以使用自定义反序列化器类...请参阅here以获取一些指示。