将flat json对象转换为分层xml

时间:2016-02-08 12:06:13

标签: javascript json xml underscore.js lodash

我有这样的json对象:

    var client = {
  "id": 1,
  "name": "John Doe",
  "name2": "Jane Doe",
  "email": "John@test.com",
  "phone": "+1-306-5555555",
  "phoneType": "Home",
  "phone2": "+1-306-5556666",
  "phone2Type": "Business",
  "gender": "Male",
  "address": "1000 Center AVE",
  "postCode": "S7J 1P3",
  "city": "Saskatoon",
  "province": "SK",
  "country": "CA",
  "dob": "1990-12-11T02:00:00.000Z",
  "maritalStatus": "Single",
  "occupation": "Software Developer",
  "createdAt": "2015-12-07T08:14:21.000Z",
  "updatedAt": "2016-01-19T13:35:10.000Z"
};

我想将其转换为XML,这不是问题,我知道像x2js这样的大型库可以为我做到这一点。

我的问题是xml文件,需要遵循这样的标准:

   <GeneralPartyInfo>
<NameInfo>
    <PersonName>
        <Surname>Doe </Surname>
        <GivenName>John</GivenName>
    </PersonName>
    <SupplementaryNameInfo>
        <SupplementaryName>Jane Doe</SupplementaryName>
    </SupplementaryNameInfo>
</NameInfo>
<Addr>
    <DetailAddr>
        <StreetName>Centre</StreetName>
        <StreetNumber>1000</StreetNumber>
        <csio:StreetTypeCd>AVE</csio:StreetTypeCd>
    </DetailAddr>
    <City>Saskatoon</City>
    <StateProvCd>SK</StateProvCd>
    <PostalCode>S7J 1P3</PostalCode>
    <CountryCd>CA</CountryCd>
</Addr>
<Communications>
    <PhoneInfo>
        <PhoneTypeCd>Phone</PhoneTypeCd>
        <CommunicationUseCd>Home</CommunicationUseCd>
        <PhoneNumber>+1-306-5555555</PhoneNumber>
    </PhoneInfo>
    <PhoneInfo>
        <PhoneTypeCd>Phone</PhoneTypeCd>
        <CommunicationUseCd>Business</CommunicationUseCd>
        <PhoneNumber>+1-306-5556666</PhoneNumber>
    </PhoneInfo>
</Communications>

你可以嵌套xml而我的json不是,不提名名需要拼接到firstName和lastName,并且在PersonName里面是NameInfo的子节点,而GeneralPartyInfo是根父节点(地址相同)。 / p>

我有两个问题,第一个是缺少标签,例如firstname是在PersonName里面,在NameInfo里面,在GeneralPartyInfo里面,我不能这样做

  var firstName = client.name.split(' ').slice(0, -1).join(' ');
  var lastName =  client.name.split(' ').slice(-1).join(' ');
  delete client.name;

client.PersonName.push({
        GiveName: firstName,
        Surname: lastName,
});

因为JSON是一个对象而不是数组,所以我需要将JSON转换为数组(这里不是其他专业人士推荐的),或者我可以将每个(名称,地址,通信)保存到其中单独的json对象然后将所有这些连接在一起abdthe我在SO中找到的唯一方法来添加父json对象就像这样

  var obj = {fistName: client.name.split(' ').slice(0, -1).join(' '), lastName: client.name.split(' ').slice(-1).join(' ');};
     var obj2 = { "PersonName" : obj };
     var obj3 = { "NameInfo" : obj2 };

我的第二个问题是找到替换密钥的方法,例如我想将邮政编码替换为PostalCode或phoneType替换为CommunicationUseCd

或者就这样做

    var xml =  "<GeneralPartyInfo><NameInfo><PersonName>
   <Surname>" + client.name.split(' ').slice(0, -1).join(' '); + "</Surname>
   <GivenName>"+client.name.split(' ').slice(-1).join(' ')+"</GivenName>"

但是这个解决方案很乏味,效率不高,看起来也不漂亮,而且我对代码的稳定性和清洁性有了更多的了解。

例如,如何操作json对象以将父级添加到所选元素,然后我可以通过具有要替换的键的列表替换键,例如。

 var translationObj = {
      "firstName": "GivenName",
      "lastName": "PersonName", 
    }

PS:我安装了lodash / underscore,因此使用下划线的解决方案会很棒。

0 个答案:

没有答案