2017-03-24 4 views
1

私は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">

ことを期待しているため、コードが失敗した....このような状況を処理する方法上の任意のアドバイス?それらの属性をルート要素に属する場所に戻す方法は?

答えて

2

NewtonSoftは、属性に接頭辞@_または__ではなく)が付いていることを前提としています。接頭辞は名前に焼き付けられるだけです。たとえば、あなたはJSONはこのように見てもらうことができる場合: - 彼らは一番下にあるどこに滞在する場合は、それを

{ 
    "cs:BookingSearch_IN": { 
     "@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", 
     "@xmlns:cs": "http://MyCompany.com", 
     "@version": "6.66", 
     "MsgHeader": { 
      "MessageID": "ABC010101", 
      "ContextRecord": { 
       "ContextInfo": { 
        "@ResType": "Vacation", 
        "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" 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

それはあなたが頂上まで、それらのXMLNS年代を移動する必要があることに注意してください(正しく動作します何らかの理由でプレフィックスを削除します)。

これが可能でない場合は、別のシリアライザを使用するか、JSONまたはXMLのプリ/ポスト処理にカスタムロジックを記述する必要があります。

+0

コードをテストする必要があったので、XMLサンプルをJSONに変換して動作するかどうかを調べるために、いくつかのオンラインツールを検索しました。私はJSON形式でXMLを表現するための「標準的な」方法がないことを知りました。 Webサイトの1つが、XMLのJSONへの変換を属性と同じように、要素の直後、接頭辞「_」で行いました。私はそのオンラインツールを使用して、 "@"を "_"に置き換えることができると思います。私はNewtonSoftが属性のために "@"を期待しているのを知らなかった。あなたの答えは私の問題を解決した...情報のおかげで! –

+0

私は 'DataContractJsonSerializer'が' _'sを使っていると言っています...しかし、標準はありません。各シリアライザには独自のメソッドがあります。 –

関連する問題