2016-04-19 31 views
1

我想讀取一個XML並轉換JSON,然後將該JSON轉換爲一個C#對象。 請記住,我可以使用linq來初始化對象,我知道這一點。 但是我想實現的是讀取xml將其轉換爲json並從轉換後的字符串反序列化爲對象。我無法正確初始化對象。 我錯過了什麼?C#Newton.Json反序列化

public class Cash 
{ 
    public string Amount { get; set; } 
} 

public class POSLog 
{ 
    public string MajorVersion { get; set; } 
    public string MinorVersion { get; set; } 
    public string FixVersionive { get; set; } 

    public Cash Cashx { get; set; } 
} 

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     try 
     { 
      XmlDocument xml = new XmlDocument(); 
      xml.LoadXml("<POSLog MajorVersion=\"6\" MinorVersion=\"0\" FixVersion=\"0\"><Cash Amount = \"100\"></Cash></POSLog>"); 

      string json = JsonConvert.SerializeObject(xml.InnerXml); 

      POSLog deserializedProduct = JsonConvert.DeserializeObject<POSLog>(json); 

      Console.WriteLine("Major Version" + deserializedProduct.MajorVersion); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 
} 
+2

爲什麼不直接從xml轉換爲對象? – Nkosi

+0

它是否正確地序列化你的json? –

+0

您還將'POSLog'中的變量命名爲'FixVersionive',它與XML中的命名不匹配。 – KDecker

回答

0

根據文檔:

Converting between JSON and XML with Json.NET

轉換規則

  • 元素保持不變。

  • 屬性前綴爲@,並且應該位於對象的起始位置。

  • 單個子文本節點是直接針對某個元素的值,否則通過#text訪問它們。

  • XML聲明和處理指令的前綴爲?。

  • 分別通過#cdata-section,#comment,#whitespace和#significant-whitespace訪問字符數據,註釋,空格和重要空白節點。

  • 在同一級別具有相同名稱的多個節點一起組成一個數組。

  • 空元素爲空。

如果從JSON創建的XML不符合您的要求,那麼您將需要手動將其轉換。這樣做的最佳方法是將JSON加載到像JObject或JArray這樣的LINQ to JSON對象中,然後使用LINQ創建一個XDocument。

考慮到以下單元測試創​​建來解決您的問題通過。

[TestClass] 
public class JsonToXmlTests : MiscUnitTests { 
    [TestMethod] 
    public void Xml_Should_Convert_To_JSON_And_Object() { 

     string xml = "<POSLog MajorVersion=\"6\" MinorVersion=\"0\" FixVersion=\"0\"><Cash Amount = \"100\"></Cash></POSLog>"; 

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

     string jsonText = JsonConvert.SerializeXmlNode(doc, Newtonsoft.Json.Formatting.None, true); 

     //Attributes are prefixed with an @ and should be at the start of the object. 
     jsonText = jsonText.Replace("\"@", "\""); 

     POSLog actual = JsonConvert.DeserializeObject<POSLog>(jsonText); 

     actual.Should().NotBeNull(); 
     actual.MajorVersion.Should().Be("6"); 
     actual.MinorVersion.Should().Be("0"); 
     actual.FixVersion.Should().Be("0"); 
     actual.Cash.Should().NotBeNull(); 
     actual.Cash.Amount.Should().Be("100"); 
    } 

    public class Cash { 
     public string Amount { get; set; } 
    } 

    public class POSLog { 
     public string MajorVersion { get; set; } 
     public string MinorVersion { get; set; } 
     public string FixVersion { get; set; } 

     public Cash Cash { get; set; } 
    } 
} 
1

您不能序列包含xml一個stringjson,並期望它反序列化到一個POSLog。在繼續之前,將您的xml反序列化爲POSLog

0

問題是你正在反序列化錯誤的東西。

您必須先從XML反序列化到POSLog,然後將POSLog序列化爲json。

void Main() 
{ 
    try 
    { 
     string xmlDoc = "<POSLog MajorVersion=\"6\" MinorVersion=\"0\" FixVersion=\"0\"><Cash Amount = \"100\"></Cash></POSLog>"; 

     XmlSerializer xser = new XmlSerializer(typeof(POSLog)); 
     POSLog fromXml = xser.Deserialize(new StringReader(xmlDoc)) as POSLog; 

     string json = JsonConvert.SerializeObject(fromXml); 

     POSLog fromJson = JsonConvert.DeserializeObject<POSLog>(json); 

     Console.WriteLine("MajorVersion=" + fromJson.MajorVersion); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
} 

// Define other methods and classes here 
public class Cash 
{ 
    public string Amount { get; set; } 
} 

public class POSLog 
{ 
    [XmlAttribute] 
    public string MajorVersion { get; set; } 
    [XmlAttribute] 
    public string MinorVersion { get; set; } 
    [XmlAttribute] 
    public string FixVersionive { get; set; } 

    public Cash Cashx { get; set; } 
}