繁体   English   中英

如何从JSON反序列化[[int,int,int,int,string,string],[…]]

[英]How to deserialize [[int,int,int,int,string,string], […]] from JSON

我从第三方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 [ 8[VkKonekoBot.vkLongpollEvents+LongpollData+ApiEvent,System.Int32,VkKonekoBot.vkLongpollEvents+LongpollData+ApiMask,System.Nullable .UInt64],System.Nullable`1 [System.UInt64],System.String,System.String,VkKonekoBot.vkLongpollEvents + LongpollData + FromInfo]',因为该类型需要JSON对象(例如{\\“ name \\”:\\“ \\ r \\ n要解决此错误,请将JSON更改为JSON对象(例如{\\“ name \\”:\\“ value \\”}),或将反序列化类型更改为数组或一种类型,它实现了可从JSON数组反序列化的List等集合接口(例如ICollection,IList)。 也可以将JsonArrayAttribute添加到该类型中,以强制其从JSON数组反序列化。\\ r \\ nPath'updates [0]',第1行,位置29。

我究竟做错了什么?

正如Gusman所指出的,在注释中,这里唯一的直接选择是将updates字段反序列化为object[][] 作为第一步,至少需要将数据转换为可以操纵的形式。

例如,您可以反序列化为此类:

class temp
{
    public long ts;
    public object[][] updates;
}

从那里,您将需要某种方式从这些数组创建Tuple或其他类型的实例。 对于文本和数字,转换就像拆箱值一样简单,对于复杂类型( {"from":"1337"} ),您将需要处理JSObject或将其转换回JSON,然后重新开始。

不简单。

您还可以使用自定义解串器类...有关某些指针,请参见此处

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM