Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用JSON.Net将XML转换为JSON字符串时未获得所需结果_C#_Json_Xml_Json.net - Fatal编程技术网

C# 使用JSON.Net将XML转换为JSON字符串时未获得所需结果

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>

下面是我们试图转换为JSON字符串的XML字符串

  <?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);