this may be another approach custom json converter a bit long but I think it's more useful
Code
public class CustomXmlToJsonConverter : JsonConverter
{
private readonly Type[] _types;
public CustomXmlToJsonConverter(params Type[] types)
{
_types = types;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
JToken t = JToken.FromObject(value);
if (t.Type != JTokenType.Object)
{
t.WriteTo(writer);
}
else
{
JObject o = (JObject)t;
IList<string> propertyNames = o.Properties().Select(p => p.Name).ToList();
o.AddFirst(new JProperty("Keys", new JArray(propertyNames)));
o.WriteTo(writer);
}
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter.");
}
public override bool CanRead
{
get { return false; }
}
public override bool CanConvert(Type objectType)
{
return _types.Any(t => t == objectType);
}
}
Usage
string json = JsonConvert.SerializeObject(root,Formatting.Indented,new CustomXmlToJsonConverter(typeof(XElement)));
Result
{
"Keys": [
"person"
],
"person": {
"@json": "http://james.newtonking.com/projects/json",
"@id": "1",
"name": "Alan",
"url": "http://www.google.com",
"role": {
"@Array": "true",
"#text": "Admin"
}
}
}
Sample Data
XNamespace jsonPrefix1 = "xmlns";
XNamespace jsonPrefix2 = "json";
XElement root = new XElement("person",
new XAttribute(jsonPrefix1 + "json", "http://james.newtonking.com/projects/json"),
new XAttribute("id","1"),
new XElement("name", "Alan"), new XElement("url", "http://www.google.com"),
new XElement("role" ,"Admin", new XAttribute(jsonPrefix2 + "Array", "true"))
);