C# 使用JSON.Net将XML转换为JSON字符串时未获得所需结果
下面是我们试图转换为JSON字符串的XML字符串C# 使用JSON.Net将XML转换为JSON字符串时未获得所需结果,c#,json,xml,json.net,C#,Json,Xml,Json.net,下面是我们试图转换为JSON字符串的XML字符串 <?xml version="1.0" encoding="utf-16" ?> <MyClass> <Id>1</Id> <Names> <string>Surya</string> <string>Kiran</string> </Names> <ClassTypes>
<?xml version="1.0" encoding="utf-16" ?>
<MyClass>
<Id>1</Id>
<Names>
<string>Surya</string>
<string>Kiran</string>
</Names>
<ClassTypes>
<Types>
<TypeId>1</TypeId>
<TypeName>First Name</TypeName>
</Types>
<Types>
<TypeId>2</TypeId>
<TypeName>Last Name</TypeName>
</Types>
</ClassTypes>
<Status>1</Status>
</MyClass>
1.
苏里亚
基兰
1.
名字
2.
姓
1.
使用下面的代码,我得到如下结果
xmlString = "<?xml version=\"1.0\" encoding=\"utf-16\"?><MyClass><Id>1</Id><Names><string>Surya</string><string>Kiran</string></Names><ClassTypes><Types><TypeId>1</TypeId><TypeName>First Name</TypeName></Types><Types><TypeId>2</TypeId><TypeName>Last Name</TypeName></Types></ClassTypes><Status>1</Status></MyClass>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlString);
doc.ChildNodes.OfType<XmlNode>().Where(x => x.NodeType == XmlNodeType.XmlDeclaration).ToList().ForEach(x => doc.RemoveChild(x));
jsonString = JsonConvert.SerializeXmlNode(doc, Newtonsoft.Json.Formatting.None, true);
xmlString=“1SuryaKiran1First Name2Last Name1”;
XmlDocument doc=新的XmlDocument();
doc.LoadXml(xmlString);
doc.ChildNodes.OfType().Where(x=>x.NodeType==XmlNodeType.xmldesclaration).ToList().ForEach(x=>doc.RemoveChild(x));
jsonString=JsonConvert.SerializeXmlNode(doc,Newtonsoft.Json.Formatting.None,true);
实际结果
{“Id”:“1”,“name”:{“string”:[“Surya”,“Kiran”]},“ClassTypes”:{“Types”:[{“TypeId”:“1”,“TypeName”:“First”
名称“},{TypeId:“2”,“TypeName:“Last Name”}]},状态:“1”}
预期结果
{“Id”:1,“name”:[“Surya”,“Kiran”],“ClassTypes”:[{“TypeId”:1,“TypeName”:“First”
名称“},{“TypeId”:2,“TypeName”:“Last Name”}],“Status”:0}
我们需要这个结果来反序列化到下面的类
public class MyClass
{
public int Id { get; set; }
public IList<string> Names { get; protected set; }
public IList<Types> ClassTypes { get; protected set; }
public StatusType Status { get; set; }
public MyClass()
{
Names = new List<string>();
ClassTypes = new List<Types>();
Status = StatusType.Active;
}
}
public class Types
{
public int TypeId { get; set; }
public string TypeName { get; set; }
}
public enum StatusType
{
Active = 0,
InActive = 1
}
公共类MyClass
{
公共int Id{get;set;}
公共IList名称{get;protected set;}
公共IList类类型{get;protected set;}
公共状态类型状态{get;set;}
公共MyClass()
{
名称=新列表();
ClassTypes=新列表();
Status=StatusType.Active;
}
}
公共类类型
{
公共int类型ID{get;set;}
公共字符串类型名{get;set;}
}
公共枚举状态类型
{
活动=0,
非活动=1
}
您可以使用linq转换xml。试试这个代码
var xmlString = "<?xml version=\"1.0\" encoding=\"utf-16\"?><MyClass><Id>1</Id><Names><string>Surya</string><string>Kiran</string></Names><ClassTypes><Types><TypeId>1</TypeId><TypeName>First Name</TypeName></Types><Types><TypeId>2</TypeId><TypeName>Last Name</TypeName></Types></ClassTypes><Status>1</Status></MyClass>";
XDocument doc = XDocument.Parse(xmlString);
XNode xNode = doc.FirstNode;
var jsonString = Newtonsoft.Json.JsonConvert.SerializeXNode(xNode, Newtonsoft.Json.Formatting.Indented, true);
var xmlString = "<?xml version=\"1.0\" encoding=\"utf-16\"?><MyClass><Id>1</Id><Names><string>Surya</string><string>Kiran</string></Names><ClassTypes><Types><TypeId>1</TypeId><TypeName>First Name</TypeName></Types><Types><TypeId>2</TypeId><TypeName>Last Name</TypeName></Types></ClassTypes><Status>1</Status></MyClass>";
var myClassObject = XmlDeserializeData<MyClass>(xmlString);
var jsonString = JsonSerializeData(myClassObject);
更新 既然OP已经用类更新了问题,下面是另一种方法 使用此代码可以获得格式正确的JSON
var xmlString = "<?xml version=\"1.0\" encoding=\"utf-16\"?><MyClass><Id>1</Id><Names><string>Surya</string><string>Kiran</string></Names><ClassTypes><Types><TypeId>1</TypeId><TypeName>First Name</TypeName></Types><Types><TypeId>2</TypeId><TypeName>Last Name</TypeName></Types></ClassTypes><Status>1</Status></MyClass>";
XDocument doc = XDocument.Parse(xmlString);
XNode xNode = doc.FirstNode;
var jsonString = Newtonsoft.Json.JsonConvert.SerializeXNode(xNode, Newtonsoft.Json.Formatting.Indented, true);
var xmlString = "<?xml version=\"1.0\" encoding=\"utf-16\"?><MyClass><Id>1</Id><Names><string>Surya</string><string>Kiran</string></Names><ClassTypes><Types><TypeId>1</TypeId><TypeName>First Name</TypeName></Types><Types><TypeId>2</TypeId><TypeName>Last Name</TypeName></Types></ClassTypes><Status>1</Status></MyClass>";
var myClassObject = XmlDeserializeData<MyClass>(xmlString);
var jsonString = JsonSerializeData(myClassObject);
更新2
由于您不能更改类,并且您的XML不是“理想的”,因此可以执行以下操作以获得所需的JSON
var xmlString = "<?xml version=\"1.0\" encoding=\"utf-16\"?><MyClass><Id>1</Id><Names><string>Surya</string><string>Kiran</string></Names><ClassTypes><Types><TypeId>1</TypeId><TypeName>First Name</TypeName></Types><Types><TypeId>2</TypeId><TypeName>Last Name</TypeName></Types></ClassTypes><Status>1</Status></MyClass>";
xmlString = xmlString.Replace("<ClassTypes>", "")
.Replace("</ClassTypes>", "")
.Replace("<Names>", "")
.Replace("</Names>", "");
xmlString = xmlString.Replace("<Types>", "<ClassTypes>")
.Replace("</Types>", "</ClassTypes>")
.Replace("<string>", "<Names>")
.Replace("</string>", "</Names>");
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlString);
var xmlNode = xmlDoc.SelectNodes("//MyClass").Item(0);
var jsonString = Newtonsoft.Json.JsonConvert.SerializeXmlNode(xmlNode, Newtonsoft.Json.Formatting.Indented, true);
var xmlString=“1SuryaKiran1First Name2Last Name1”;
xmlString=xmlString.Replace(“,”)
.替换(“,”)
.替换(“,”)
.替换(“,”);
xmlString=xmlString.Replace(“,”)
.替换(“,”)
.替换(“,”)
.替换(“,”);
var xmlDoc=新的XmlDocument();
LoadXml(xmlString);
var xmlNode=xmlDoc.SelectNodes(“//MyClass”)。项(0);
var jsonString=Newtonsoft.Json.JsonConvert.SerializeXmlNode(xmlNode,Newtonsoft.Json.Formatting.Indented,true);
注意它将生成所需的json,但这是一个丑陋的攻击!应使用前面的任何一种方法。谢谢,我的限制是无法将IList更改为List。@suryakiran查看这是否为您提供了正确的方向@suryakiran如果您愿意,您可以尝试更新2中的破解方法!是否有任何通用的替代方法来更改Json字符串。可以是替换:{“…”为空字符串,替换]},替换为},&]}}替换为]}
{
"Id": 1,
"Names": [
"Surya",
"Kiran"
],
"ClassTypes": [
{
"TypeId": 1,
"TypeName": "First Name"
},
{
"TypeId": 2,
"TypeName": "Last Name"
}
],
"Status": "InActive"
}
var xmlString = "<?xml version=\"1.0\" encoding=\"utf-16\"?><MyClass><Id>1</Id><Names><string>Surya</string><string>Kiran</string></Names><ClassTypes><Types><TypeId>1</TypeId><TypeName>First Name</TypeName></Types><Types><TypeId>2</TypeId><TypeName>Last Name</TypeName></Types></ClassTypes><Status>1</Status></MyClass>";
xmlString = xmlString.Replace("<ClassTypes>", "")
.Replace("</ClassTypes>", "")
.Replace("<Names>", "")
.Replace("</Names>", "");
xmlString = xmlString.Replace("<Types>", "<ClassTypes>")
.Replace("</Types>", "</ClassTypes>")
.Replace("<string>", "<Names>")
.Replace("</string>", "</Names>");
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlString);
var xmlNode = xmlDoc.SelectNodes("//MyClass").Item(0);
var jsonString = Newtonsoft.Json.JsonConvert.SerializeXmlNode(xmlNode, Newtonsoft.Json.Formatting.Indented, true);