私はJSONリクエストを渡すサービスに取り組んでいます。これをXMLに変換してXMLスキーマと比較してから、何かを行う必要があります。C#でJSONをXMLに変換する際の問題処理属性
私の問題は属性にあります。例えば、私のJSON要求は次のとおりです。
{
"BookingSearch_IN": {
"MsgHeader": {
"MessageID": "ABC010101",
"ContextRecord": {
"ContextInfo": {
"ItineraryDetails": {
"ItinerarySeqNmbr": "1",
"StartDate": "2017-04-01",
"EndDate": "2017-04-14",
"LocationStart": {
"LocationContext": "AIRPORT",
"LocationCode": "MIA"
},
"LocationEnd": {
"LocationContext": "AIRPORT",
"LocationCode": "MIA"
}
},
"ExtraInfoList": {
"ExtraInfo": {
"Category": "CRUISE",
"Item": {
"Code": "SHIP_CODE",
"Value": "MAGIC"
}
}
},
"_ResType": "Vacation"
}
}
},
"_xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
"_xmlns:cs": "http://MyCompany.com",
"_version": "6.66",
"__prefix": "cs"
}
}
私が使用している:XmlDocument doc = JsonConvert.DeserializeXmlNode(jsonObject);
XMLに変換します。 XML結果は次のとおり
<BookingSearch_IN>
<MsgHeader>
<MessageID>ABC010101</MessageID>
<ContextRecord>
<ContextInfo>
<ItineraryDetails>
<ItinerarySeqNmbr>1</ItinerarySeqNmbr>
<StartDate>2017-04-01</StartDate>
<EndDate>2017-04-14</EndDate>
<LocationStart>
<LocationContext>AIRPORT</LocationContext>
<LocationCode>MIA</LocationCode>
</LocationStart>
<LocationEnd>
<LocationContext>AIRPORT</LocationContext>
<LocationCode>MIA</LocationCode>
</LocationEnd>
</ItineraryDetails>
<ExtraInfoList>
<ExtraInfo>
<Category>CRUISE</Category>
<Item>
<Code>SHIP_CODE</Code>
<Value>MAGIC</Value>
</Item>
</ExtraInfo>
</ExtraInfoList>
<_ResType>Vacation</_ResType>
</ContextInfo>
</ContextRecord>
</MsgHeader>
<xsi>http://www.w3.org/2001/XMLSchema-instance</xsi><cs>http://MyCompany.com</cs><_version>6.66</_version><__prefix>cs</__prefix>
</BookingSearch_IN>
結果XMLは、別の要素(between </MsgHeader> and </BookingSearch_IN>)
として、文書の末尾にルート要素の属性を有しています。私の問題は、他の顧客のXMLに対してこのXMLを検証するサービスが、ルート要素のこれらの属性をチェックするということです。ここでは、コードはXMLがあることを期待する方法である:
<?xml version="1.0" encoding="UTF-8"?>
<cs:BookingSearch_IN xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cs="http://MyCompany.com" version="6.66">
<MsgHeader>
<MessageID>ABC010101</MessageID>
<ContextRecord>
<ContextInfo ResType="Vacation">
<ItineraryDetails>
<ItinerarySeqNmbr>1</ItinerarySeqNmbr>
<StartDate>2017-04-01</StartDate>
<EndDate>2017-04-14</EndDate>
<LocationStart>
<LocationContext>AIRPORT</LocationContext>
<LocationCode>MIA</LocationCode>
</LocationStart>
<LocationEnd>
<LocationContext>AIRPORT</LocationContext>
<LocationCode>MIA</LocationCode>
</LocationEnd>
</ItineraryDetails>
<ExtraInfoList>
<ExtraInfo>
<Category>CRUISE</Category>
<Item>
<Code>SHIP_CODE</Code>
<Value>MAGIC</Value>
</Item>
</ExtraInfo>
</ExtraInfoList>
</ContextInfo>
</ContextRecord>
</MsgHeader>
</cs:BookingSearch_IN>
それがルート要素が<cs:BookingSearch_IN xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cs="http://MyCompany.com" version="5.22">
ことを期待しているため、コードが失敗した....このような状況を処理する方法上の任意のアドバイス?それらの属性をルート要素に属する場所に戻す方法は?
コードをテストする必要があったので、XMLサンプルをJSONに変換して動作するかどうかを調べるために、いくつかのオンラインツールを検索しました。私はJSON形式でXMLを表現するための「標準的な」方法がないことを知りました。 Webサイトの1つが、XMLのJSONへの変換を属性と同じように、要素の直後、接頭辞「_」で行いました。私はそのオンラインツールを使用して、 "@"を "_"に置き換えることができると思います。私はNewtonSoftが属性のために "@"を期待しているのを知らなかった。あなたの答えは私の問題を解決した...情報のおかげで! –
私は 'DataContractJsonSerializer'が' _'sを使っていると言っています...しかし、標準はありません。各シリアライザには独自のメソッドがあります。 –