【问题标题】:Convert XML without any attributes/metadata into a .NET object将没有任何属性/元数据的 XML 转换为 .NET 对象
【发布时间】:2014-07-23 03:13:17
【问题描述】:

我有一个对象,我使用修改后的 DataContractSerializer 将其转换为 XML。

我去掉了所有的元数据/命名空间等,所以结果就是:

<myObject> <someProperty>5</someProperty> <mySubObjects> <mySubObject>...</mySubObject> <mySubObject>...</mySubObject> ... </myObject>

等等

我想知道是否可以将其放回对象中。

我能够通过使用 JSON.NET 将其转换为有效的 JSon 来部分地做到这一点,但是尽管阅读了一些关于它的解释,但我无法理解的反序列化 JSon 和列表存在问题。

XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string jsonText = JsonConvert.SerializeXmlNode(doc, Newtonsoft.Json.Formatting.None, true);
var obj = JsonConvert.DeserializeObject<T>(jsonText);

无法反序列化当前 JSON 对象(例如 {"name":"value"}) 进入类型“...”,因为该类型需要 JSON 数组(例如 [1,2,3]) 正确反序列化。要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3])或更改反序列化类型,使其 是一个普通的 .NET 类型(例如,不是像整数这样的原始类型,而不是 集合类型,如数组或列表),可以从 JSON 对象。 JsonObjectAttribute 也可以添加到类型中以 强制它从 JSON 对象反序列化。

应该有一个更直接的解决方案,因为源数据也来自对象,所以永远不会出现尝试进行无效转换的问题,某种映射库或其他东西应该能够解决这个问题.有什么想法吗?

【问题讨论】:

  • 我不清楚你想做什么。 “将其放回对象中”是什么意思?您说您尝试使用 JSON 进行某些操作,但它“抱怨 Lists an IEnumerables”并没有告诉我们您尝试做什么。
  • 忽略 JSON 部分,我想将 XML 转换为对象。由于没有元数据,我认为 XmlSerializer 不会工作(当我尝试时,我收到错误“无效的 xml”,但我可以将 XML 放入XmlDocument,所以它必须是有效的)。我想我只需要一些东西来迭代并将每个条目映射到一个对象,但它必须足够聪明才能处理列表。我已经澄清了我的问题(今天压力很大!)
  • 这个结构看起来你应该可以很好地使用 XMLSerilizer。它可以处理数组和列表之类的东西。您只需要创建与您在那里的结构相匹配的类。您在类上放置的属性告诉它标签的名称。以您的示例为指导,您将需要一个名为 myObject 的类,以及一个名为 someProperty 的整数属性。然后它需要一个名为 mySubObjects 的数组或 List
  • 是的,这就是我所拥有的——因为源 XML 来自被反序列化的对象,被剥离了任何元数据等,然后用于重新创建对象。我只是收到错误There is an error in XML document (1, 133). {"Input string was not in a correct format."},没有任何解释它是如何不正确的格式。我想知道它是否进行了无效的演员表?因为它没有关于数据类型的任何信息。
  • 所以你想重新创建对象,即使你剥离了元数据?我不确定这意味着什么,但听起来不可能。

标签: c# xml-deserialization


【解决方案1】:

编辑:根据 cmets,这是您无需转换为 JSON 的方法

string xml = "<myObject>\n" +
             "  <someProperty>5</someProperty>\n" +
             "  <mySubObjects>\n" +
             "      <mySubObject>test</mySubObject>\n" +
             "      <mySubObject>test</mySubObject>\n" +
             "  </mySubObjects>\n" +
             "</myObject>\n";

using (TextReader reader = new StringReader(xml))
{
    XmlSerializer serializer = new XmlSerializer(typeof(myObject));
    var obj = serializer.Deserialize(reader);

}

支持类:

[Serializable()]
public class myObject
{
    [XmlElement("someProperty")]
    public string someProperty { get; set; }

    [XmlArray("mySubObjects")]
    [XmlArrayItem("mySubObject", typeof(string))]
    public List<string> mySubObjects { get; set; }
}

******使用 JSON 的先前响应:********

这段代码应该为你做:

string xml = "<myObject>\n" +
             "  <someProperty>5</someProperty>\n" +
             "  <mySubObjects>\n" +
             "      <mySubObject>test</mySubObject>\n" +
             "      <mySubObject>test</mySubObject>\n" +
             "  </mySubObjects>\n" +
             "</myObject>\n";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string jsonText = JsonConvert.SerializeXmlNode(doc);
var obj = JsonConvert.DeserializeObject<RootObject>(jsonText);

以下是支持类:

public class MySubObjects
{
    public List<string> mySubObject { get; set; }
}

public class MyObject
{
    public string someProperty { get; set; }
    public MySubObjects mySubObjects { get; set; }
}

public class RootObject
{
    public MyObject myObject { get; set; }
}

您遇到的问题是它试图将 mySubObjects 转换为类而不是列表。这是因为它将每个 mySubObject 视为对象本身。通过创建一个类并将 List 作为属性公开,JSON.Net 可以将每个 mySubObject 添加到公开的列表中。将其更改为 JSON 数组的意思是完全取出 mySubObjects 节点,只使用多个 . JSON.Net 然后将其视为一个数组并将其直接转换为 List 而无需将其封装在单独的类中。我希望我解释正确。

【讨论】:

  • 我明白了,这确实有道理。虽然我不能改变格式。是否有一些元数据属性我可以用来告诉它它是List&lt;T&gt; 而无需编写一些复杂的自定义反序列化器类?如果没有,可能只需要放弃这个,也许只存储 xml 而不会剥离所有元数据。
  • 请看我上面的编辑。我认为这对你有用。它跳过了必须使用 JSON 并使用 XmlSerializer 对其进行转换。这样,您只需要一个类。
猜你喜欢
  • 2013-03-17
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
相关资源
最近更新 更多