9

クラスのSerializeXmlNode関数Newtonsoft.Json.JsonConvertは、シリアル化プロセスで常に XML の最後の子ノードの値を文字列型として出力します。これは、整数またはブール値としてシリアル化する必要がある場合があります。

サンプルコード:

<Object>
  <ID>12</ID>
  <Title>mytitle</Title>
  <Visible>false</Visible>
</Object>

出力:

{ "ID" : "12",
  "Title" : "mytitle",
  "Visible" : "false"
}

望ましい出力:

{ "ID" : 12,
  "Title" : "mytitle",
  "Visible" : false
}

XML ノードを強制的に整数またはブール値としてシリアル化する方法はありますか?

ありがとうございました。

注: XML が既に JSON 文字列にシリアル化されている場合は回避策を投稿しないでください。これらの回避策は回避したいと考えているためです。

4

2 に答える 2

9

JSON.NET は、XML シリアライゼーション用のツールではありません。XML ノードのシリアル化は、XML と JSON の間で 1 対 1 の対応を提供することを目的としています。XML の属性は文字列型のみであるため、シリアル化中に型情報は保持されません。JSON に逆シリアル化する場合は役に立ちません。

XML を JSON に変換する必要がある場合は、XML と JSON の両方のシリアル化をサポートする DTO クラスを使用することをお勧めします。

[XmlRoot ("Object"), JsonObject]
public class Root
{
    [XmlElement, JsonProperty]
    public int Id { get; set; }

    [XmlElement, JsonProperty]
    public string Title { get; set; }

    [XmlElement, JsonProperty]
    public bool Visible { get; set; }
}

XML からデシリアライズしてから、JSON にシリアライズします。

public class Program
{
    private const string xml = @"
        <Object>
          <Id>12</Id>
          <Title>mytitle</Title>
          <Visible>false</Visible>
        </Object>";

    private static void Main ()
    {
        var serializer = new XmlSerializer(typeof(Root));
        var root = (Root)serializer.Deserialize(new StringReader(xml));
        Console.WriteLine(JsonConvert.SerializeObject(root, Formatting.Indented));
        Console.ReadKey();
    }
}

出力:

{
  "Id": 12,
  "Title": "mytitle",
  "Visible": false
}
于 2013-09-04T15:58:31.557 に答える