【问题标题】:JSON to XML class conversionsJSON 到 XML 类的转换
【发布时间】:2017-03-31 08:05:19
【问题描述】:

我似乎无法将 Json 的类排成 Linq XML。

c.firstc.secondc.third 被突出显示并声明:

“您是否缺少 using 指令或程序集引用。”

var serializer = new JavaScriptSerializer();
var json1 = "[count:[place:{first:1,second:2,third:3}],[place:{first:11,second:22,third:33}],[place:{first:111,second:222,third:333}]]]";
var jsons = serializer.Serialize(json1);
var jsona = serializer.Deserialize<List<jClass>>(jsons);
var xmld = new XDocument(
    new XElement("count", jsona.Select(c =>
        new XElement("place",
            new XElement("first", c.first),
            new XElement("second", c.second),
            new XElement("third", c.third)
        )
    ))
);

类.cs

public class jClass
{
    public jNumber[] count { get; set; }
}
public class jNumber
{
    public jTopThree[] place { get; set; }
}
public class jTopThree
{
    public int first { get; set; }
    public int second { get; set; }
    public int third { get; set; }
}

【问题讨论】:

  • cjClass 类型,它只包含属性count,它是jNumber 的数组。您实际上要选择哪个值? 1? 22?第333章?
  • 如何将 jTopThree 等同起来,以便创建 xml 文档中的所有第一个、第二个和第三个?
  • 没关系,我知道你的 JSON 应该是什么样子了。您有所需 XML 的示例吗?

标签: c# json xml linq class


【解决方案1】:

你的问题是你的对象结构本质上是一个数组数组,你只做一个选择。在您构建 xml 的位置,您的 c 变量位于 jClass 级别,因此您尝试从中读取 firstsecondthird 属性。

目前还不清楚您的 xml 结构应该是什么,但您要么需要使用更多的 .Select 调用来进一步深入到 jTopThree 实例,要么使用 .SelectMany 将其展平,或者更改您的对象定义增加了一点。

【讨论】:

  • 我还需要两个“.Select” 他们需要为每个班级标题分层 你在第二个和第三个“.Select”前面放了什么来代表各自的班级?
  • 您有尝试输出的 XML 示例吗?
【解决方案2】:

json 文本和对象结构似乎无效。你可以试试这样的..

对象结构

public class jClass
{
    public jTopThree[] count { get; set; }
}
public class jTopThree
{
    public int first { get; set; }
    public int second { get; set; }
    public int third { get; set; }
}

序列化

        var serializer = new JavaScriptSerializer();
        var json1 = "{count:[{first:1,second:2,third:3},{first:11,second:22,third:33},{first:111,second:222,third:333}]}";
        var obj = serializer.Deserialize<jClass>(json1);
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(jClass));
        string xmlString;
        using (System.IO.StringWriter sww = new System.IO.StringWriter())
        {
            using (XmlWriter writer = XmlWriter.Create(sww))
            {
                xmlSerializer.Serialize(writer, obj);
                xmlString = sww.ToString();
            }
        }

【讨论】:

  • 我正在尝试制作整个 xml 字符串文档。 12....
【解决方案3】:
        var json1 = "[{\"place\":{\"first\":1,\"second\":2,\"third\":3}},{\"place\":{\"first\":11,\"second\":22,\"third\":33}},{\"place\":{\"first\":111,\"second\":222,\"third\":333}}]";
        XmlDocument deserializeXmlNode;
        if (json1.IndexOf("[", StringComparison.OrdinalIgnoreCase) == 0)
        {
            deserializeXmlNode = Newtonsoft.Json.JsonConvert.DeserializeXmlNode($"{{\"items\":{json1}}}", "source");
        }
        else
        {
            deserializeXmlNode = Newtonsoft.Json.JsonConvert.DeserializeXmlNode(json1, "source");
        }

        Console.WriteLine(deserializeXmlNode.OuterXml);

如果您只想复制到 XML 并负担得起 Nugget 包,请使用 Newtonsoft.Json 并修改上面的代码以满足您的需求。我稍微更改了输入 json,因为它对 http://www.json.org/ 无效。不过,它应该适用于任何有效的 JSON。

http://www.newtonsoft.com/json/help/html/ConvertingJSONandXML.htm

How to convert JSON to XML or XML to JSON?

【讨论】:

    【解决方案4】:

    首先,您的 JSON 格式错误,根据您的示例,我认为它应该看起来像这样(对我来说,“地方”似乎是多余的,但我现在已经离开了):

    {
    “计数”:[
    {“地点”:[
    {“第一”:1,“第二”:2,“第三”:3}]},
    {“地点”:[
    {"first":11,"second":22,"third":33}]},
    {“地点”:[
    {"first":111,"second":222,"third":333}]}
    ]
    }

    你的类应该是这样的:

    public class RootObject
    {
        public List<Count> count { get; set; }
    }
    
    public class Count
    {
        public List<Place> place { get; set; }
    }
    
    public class Place
    {
        public int first { get; set; }
        public int second { get; set; }
        public int third { get; set; }
    }
    

    最后你可以用这种方式创建 XML:

    var serializer = new JavaScriptSerializer();
    var json = "your json string";
    var result= serializer.Deserialize<RootObject>(json);
    var xmld = new XDocument(
               new XElement("count", result.count
                   .SelectMany(p => p.place)
                   .Select(x => 
                       new XElement("place",
                           new XElement("first", x.first),
                           new XElement("second", x.second),
                           new XElement("third", x.third)
                       )
                    ))
               );
    

    输出:

    <count>
      <place>
        <first>1</first>
        <second>2</second>
        <third>3</third>
      </place>
      <place>
        <first>11</first>
        <second>22</second>
        <third>33</third>
      </place>
      <place>
        <first>111</first>
        <second>222</second>
        <third>333</third>
      </place>
    </count>
    

    【讨论】:

    • result.count.Select(c => c) .SelectMany(p => p.place)
    • 我不确定这是否是您的意思,但是是的,额外的选择是多余的,因此我已将其删除。结果是一样的。
    猜你喜欢
    • 2014-01-17
    • 1970-01-01
    • 2012-08-16
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 2014-03-27
    相关资源
    最近更新 更多