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)