代码之家  ›  专栏  ›  技术社区  ›  Alk

解析不带标记F的JSON#

  •  1
  • Alk  · 技术社区  · 7 年前

    我正在尝试反序列化以下JSON:

        {  
       "-L3ELSSzZPRdjCRcFTrb":{  
          "senderId":"SWs56OIGzMdiCjSXahzDQX8zve92",
          "senderName":"alberto",
          "text":"Hi"
       },
       "-L3EN1NW5hHWBTEGC9ve":{  
          "senderId":"YMM45tgFFvYB7rx9PhC2TE5eW6D2",
          "senderName":"David",
          "text":"Hey"
       }
    }
    

    为此,我创建了以下两条记录:

    type MessageContent = 
    { senderId: string
      senderName: string
      text: string; }
    
    type Messages = 
        {
            messages_list : Map<string,MessageContent>;
        }
    

    接下来,我打电话:

    let messages_json = JsonConvert.DeserializeObject<Types.Messages>(html)
    

    但是,这会产生以下结果:

    {{messages_list = null;}}
    

    问题似乎是没有 messages_list JSON中的标记,因此转换器找不到此标记并返回null。在没有初始标记的情况下,我如何处理这样的jSON?

    1 回复  |  直到 7 年前
        1
  •  3
  •   wasatz    7 年前

    最简单的方法可能是使用 [<JsonExtensionData>] 属性和添加 [<CLIMutable>]

    像这样更改消息类型(您可能还需要添加 [<CLIMutable>] 到您的 MessageContent 类型)

    [<CLIMutable>]
    type Messages = { [<JsonExtensionData>] messages : IDictionary<string, JToken> }
    

    然后可以将其反序列化为这样的映射

    let msg = JsonConvert.DeserializeObject<Messages>(html)
    let messagemap = 
        msg.messages 
        |> Seq.map (fun kvp -> kvp.Key, kvp.Value.ToObject<MessageContent>())
        |> Map.ofSeq
    

    这会给你留下 消息内容 记录。