F# 嵌套json解析失败,在F中#

F# 嵌套json解析失败,在F中#,f#,json.net,F#,Json.net,我收到以下数据: "success": true, "data": { "offerId": "20e5ba08-7418-43c3-9b12-bb295dad9167", "state": "OFFER/SEND", "originatorPeerID": "12D3KooWActVJaoiYYy5ZGvSjuY4

我收到以下数据:

  "success": true,
  "data": {
    "offerId": "20e5ba08-7418-43c3-9b12-bb295dad9167",
    "state": "OFFER/SEND",
    "originatorPeerID": "12D3KooWActVJaoiYYy5ZGvSjuY4KNLz6rqCk4Vu7wJhCacpuwQP",
    "beneficiaryPeerID": "8bfbd2d42bdf",
    "p2pLastMessage": "{\"id\":0,\"offerId\":\"20e5ba08-7418-43c3-9b12-bb295dad9167\",\"p2pId\":\"12D3KooWActVJaoiYYy5ZGvSjuY4KNLz6rqCk4Vu7wJhCacpuwQP\",\"offer\":{\"market\":\"BTC/USDT\",\"baseCurrencyAddress\":\"BTC\",\"baseCurrencyChain\":\"BTC\",\"quoteCurrencyAddress\":\"0xdAC17F958D2ee523a2206206994597C13D831ec7\",\"quoteCurrencyChain\":\"ETH\",\"orderAction\":0,\"price\":\"200000/25000000\",\"quantities\":\"200000/25000000\",\"dark\":false,\"validUntil\":\"2020-10-26T23:44:51.925Z\"},\"expiration\":\"2020-10-26T23:44:51.925Z\",\"timestamp\":\"2020-10-26T19:44:52.942138926Z\"}",
    "timestamp": "2020-10-26T19:44:54.293187793Z"
  },
  "version": "2"
}
我正在尝试反序列化它

我创建了以下类型:

type SiRoot =
    {
        Success: bool
        Data:    SiData list
        Version: string
    }
and SiData =
    {
        OfferId:           string
        State:             string
        OriginatorPeerID:  string
        BeneficiaryPeerID: string
        P2pLastMessage:    SiP2PMessage
        Timestamp:         string
    }
and SiP2PMessage =
    {
        Id:         int
        OfferId:    string
        P2pId:      string
        Offer:      SiOffer
        Expiration: DateTime
        Timestamp:  DateTime
    }
and SiOffer =
    {
        Market:               string
        BaseCurrencyAddress:  string
        BaseCurrencyChain:    string
        QuoteCurrencyAddress: string
        QuoteCurrencyChain:   string
        OrderAction:          int
        Price:                string
        Quantities:           string
        Dark:                 bool
        ValidUntil:           DateTime
    }
当我试图以这种方式反序列化它时:

let d = JsonConvert.DeserializeObject<SiRoot>(data)
它将正确地反序列化

但我不明白的是我可以这样做:

let d = JsonConvert.DeserializeObject<SiRoot>(data)
let m = JsonConvert.DeserializeObject<SiP2PMessage>(data.Head.P2pLastMessage)
let d=JsonConvert.DeserializeObject(数据)
设m=JsonConvert.DeserializeObject(data.Head.P2pLastMessage)
它会正常运行

所以看起来它不会反序列化嵌套对象,但是如果我反序列化一个层,那么下一个层就可以了。 最后一层(SiOffer)无论如何都不会反序列化


有人能解释这种“分层”行为吗?还是我遗漏了一些简单的东西?

p2pLastMessage
值不是JSON对象,而是字符串。该值表示一个序列化对象,但每个引号字符(
)都用反斜杠(
\
)转义,而不是最后一个。格式正确的嵌套对象如下所示(缩进仅用于可读性):

{
“成功”:没错,
“数据”:{
“奥菲德”:“20e5ba08-7418-43c3-9b12-bb295dad9167”,
“状态”:“提供/发送”,
“发起人工程”:“12D3Koowactvjaoiyyyyyy5zgvsjuy4knlz6rqck4vu7wjhcapuwqp”,
“受益人类型ID”:“8BFBD24BDF”,
“信息”:{
“id”:0,
“奥菲德”:“20e5ba08-7418-43c3-9b12-bb295dad9167”,
“p2pId”:“12D3Koowactvjaoiyyyyyyyy5zgvsjuy4knlz6rqck4vu7wjhcapuwqp”,
“要约”:{
“市场”:“BTC/USDT”,
“baseCurrencyAddress”:“BTC”,
“baseCurrencyChain”:“BTC”,
“quoteCurrencyAddress”:“0xdAC17F958D2ee523a2206206994597C13D831ec7”,
“quoteCurrencyChain”:“ETH”,
“orderAction”:0,
“价格”:“200000/25000000”,
“数量”:“200000/25000000”,
“黑暗”:假,
“validUntil”:“2020-10-26T23:44:51.925Z”
},
“到期日”:“2020-10-26T23:44:51.925Z”,
“时间戳”:“2020-10-26T19:44:52.942138926Z”
},
“时间戳”:“2020-10-26T19:44:54.293187793Z”
},
“版本”:“2”
}
这就是为什么在反序列化根对象时,必须再次使用
JsonConvert.DeserializeObject
从字符串反序列化嵌套对象


您可以从另一个角度看它。生成此消息的服务首先只将嵌套对象序列化为字符串,将此字符串分配给根对象的字段,然后序列化根对象,生成您的问题的结果。

您好,很有趣,也许它需要一个元素数组?我尝试将这些对象后面的“list”放在嗯,但它的行为是一样的
let d = JsonConvert.DeserializeObject<SiRoot>(data)
let m = JsonConvert.DeserializeObject<SiP2PMessage>(data.Head.P2pLastMessage)