Search code examples
c#xmljson.netxml-deserialization

C# Convert JSON to XML with Attribute and Value


I have a json like below

{
    "Title": null,
    "ProjectName": {
        "@Label": "Project Name",
        "Value": "Test Project Name",
        "@Template": ""
    },
    "ModelNo": {
        "@Label": "Model",
        "Value": "Test Model Number",
        "@Template": ""
    }    
}

I want to convert it to xml like below:

<Root>
    <Title>Test Title</Title>
    <ProjectName Label="Project Name" Template="">Test Project Name</ProjectName>
    <ModelNo Label="Model" Template="">Test Model Number</ModelNo>
</Root>

At present, I used something by JsonConvert.DeserializeXmlNode(Json.ToString()) and add XmlAttribute, the result will be

<Root>
    <Title>Test Title</Title>
    <ProjectName Label="Project Name" Template=""><Value>Test Project Name</Value></ProjectName>
    <ModelNo Label="Model" Template=""><Value>Test Model Number</Value></ModelNo>
</Root>

How to make sure there is no Value, and map Value to xml text


Solution

  • You can replace/build a new JSON via LINQ to JSON API. For example (assuming the source values are in the JSON, otherwise analyze and manipulate the jp.Value):

    var js = """
             {
                 "Title": "Test Title",
                 "ProjectName": {
                     "@Label": "Project Name",
                     "Value": "Test Project Name",
                     "@Template": ""
                 },
                 "ModelNo": {
                     "@Label": "Model",
                     "Value": "Test Model",
                     "@Template": ""
                 }
             }
             """;
    var jObject = JObject.Parse(js);
    var jsonProperties = jObject.Descendants()
        .OfType<JProperty>()
        .Where(jp => jp.Name == "Value")
        .ToList();
    foreach (JProperty jp in jsonProperties)
    {
      // replace "Value" with "#text" property name 
      jp.Replace(new JProperty("#text", jp.Value)); 
    }
    
    var deserializeXmlNode = JsonConvert.DeserializeXmlNode(jObject.ToString(), "Root");
    
    Console.WriteLine(deserializeXmlNode.OuterXml);
    

    Result (formatted):

    <Root>
        <Title>Test Title</Title>
        <ProjectName Label="Project Name" Template="">Test Project Name</ProjectName>
        <ModelNo Label="Model" Template="">Test Model</ModelNo>
    </Root>