2013-03-05 12 views
6

Jak mogę uzyskać JSON.Net do serializowania mojego XML do wielbłąda JSON i bez "@"?JSON.Net serializuje XML na wielbłądzie JSON

to co aktualnie mam ale poprzedza @ do właściwości i nie wielbłądach przypadek ...

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(myXmlString); 

string jsonText = Newtonsoft.Json.JsonConvert.SerializeObject(doc, new JsonSerializerSettings() 
{ 
    NullValueHandling = NullValueHandling.Ignore, 
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore, 
    ContractResolver = new CamelCasePropertyNamesContractResolver() 
}); 

Odpowiedz

10

Zrób model danych XML

przykładowy

public class MyClass 
    { 
     [JsonProperty("@SomeXMLProperty")] 
     public string MyString{ get; set; } 
    } 

następnie przekształcić XML do swojego modelu

XDocument xmlDocument = XDocument.Parse(xmlData); 
string jsonData = JsonConvert.SerializeXNode(xmlDocument); 
var myClass = JsonConvert.DeserializeObject<MyClass>(jsonData); 

następnie wystarczy użyć CamelCasePropertyNamesContractResolver i Formatting.Indented

string json = JsonConvert.SerializeObject(rootObject, 
           Newtonsoft.Json.Formatting.Indented, 
           new JsonSerializerSettings { ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver() }); 

UPDATE:

Pierwsze rozwiązanie jest proste i czyste (nie trzeba pisać własne resolwera itd) jest to po prostu dla usuwanie @ znak

var xml = new XmlDocument(); 
    xml.XmlResolver = null;   
    xml.Load("yourfilehere"); 

    var json = JsonConvert.SerializeXmlNode(xml, Newtonsoft.Json.Formatting.Indented); 

    var withoutATSign = System.Text.RegularExpressions.Regex.Replace(json, "(?<=\")(@)(?!.*\":\\s)", String.Empty, System.Text.RegularExpressions.RegexOptions.IgnoreCase); 

Jeśli ktoś wie, być rozwiązanie ttera dla obu przypadków, to najpierw byłoby miło spojrzeć na to.

dodatek WebAPI

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; 
json.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented; 
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
+0

mówisz do Serializować następnie deserializowania następnie Serializować ponownie? – Homer

+0

Tak, pierwsze rozwiązanie jest najczystsze. Czy używasz WebAPI i potrzebujesz wielbłąda? Jeśli tak, to tylko dwie linie. –

Powiązane problemy