2017-03-24 6 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의 유효성을 검사하는 서비스가 루트 요소에서 이러한 특성을 검사한다는 것입니다. ....는 루트 요소는 <cs:BookingSearch_IN xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cs="http://MyCompany.com" version="5.22">

될 것으로 기대하기 때문에

<?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> 

코드가 실패 할이 상황을 처리하는 방법에 대한 조언을 : 다음 코드는 XML이 될 것으로 예상 어떻게? 또는 이러한 속성을 루트 요소에 속한 위치로 다시 가져 오는 방법은 무엇입니까?

답변

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을 사전/사후 처리하기 위해 다른 serializer를 사용해야하거나 사용자 정의 논리를 작성해야합니다.

+0

필자는 코드를 테스트해야했기 때문에 XML 샘플을 JSON으로 변환하고 작동하는지 확인하기 위해 온라인 도구를 검색했습니다. JSON 형식으로 XML을 표현하는 "표준"방법이 없다는 것을 알았습니다. 웹 사이트 중 하나에서 XML을 JSON으로 변환했습니다.이 방식은 요소 바로 다음에 접두사 "_"가있는 방식으로 속성을 사용했습니다. 나는 그 온라인 도구를 사용하여 "_"대신 "_"을 사용할 수 있다고 생각합니다. 나는 NewtonSoft가 그 속성에 대해 "@"를 예상했는지 몰랐다. 당신의 대답은 내 문제를 해결했습니다 ... 정보 주셔서 감사합니다! –

+0

'DataContractJsonSerializer'가'_'s ...를 사용한다고 말하고 싶습니다. 그러나 그래, 표준이 없으며, 각 시리얼 라이저에는 자체 메서드가 있습니다. –