从XML / JSON加载作为对象的扩展方法而不是字符串

时间:2014-10-06 17:17:06

标签: c# xml json json.net extension-methods

我有下面的代码,它接受包含XML和JSON的文件,并将JSON / XML反序列化为对象

    using (var streamReader = new StreamReader("output.json"))
    {
        var rawJsonToLoad = streamReader.ReadLine();
        var jsonWalkOrder = rawJsonToLoad.FromJson<MeterWalkOrder>();
        Debug.WriteLine(jsonWalkOrder.Dump());
    }


    var xml = File.ReadAllText("WalkOrder.xml");
    var xmlTest = xml.LoadFromXML<MeterWalkOrder>();

JSON

{
    Name: Red Route,
    Meters: 
    [
        {
            __type: "WindowsFormsApplication1.Classes.Meter, WindowsFormsApplication1",
            MeterID: 1,
            SerialNumber: 12345
        },
        {
            __type: "WindowsFormsApplication1.Classes.Meter, WindowsFormsApplication1",
            MeterID: 2,
            SerialNumber: SE
        }
    ]
}
[
    1,
    441,
    2
]

XML

 <MeterWalkOrder>
      <Name>Red Route</Name>
      <Meters>
        <Meter>
          <MeterID>1</MeterID>
          <SerialNumber>12345</SerialNumber>
        </Meter>
        <Meter>
          <MeterID>2</MeterID>
          <SerialNumber>SE</SerialNumber>
        </Meter>
      </Meters>
    </MeterWalkOrder>

虽然从表面上看这确实很好,但它有一个主要的缺点,它使用扩展方法,这些方法都扩展了字符串数据类型

我真正希望能够做的事情就是说

var xml = File.ReadAllText("WalkOrder.xml");
var xmlTest = new MeterWalkOrder();
xmlTest.LoadFromXML(xml);

如何使用扩展对象而不是字符串的扩展方法来完成?

我不喜欢当前的方法,因为它没有足够的灵活性,它会强制创建新对象。例如,使用当前方法,如果我有一个5米的列表,我想从JSON字符串添加另外10米,我将无法,因为fromJson将迫使我重新创建我的米列表所以我只有文件中的10米,而不是那些已经在列表中的10 + 5

编辑 - 以下评论我尝试了一种实际上完全展示我的问题的扩展方法

  public static class ObjectExtensions
  {
        public static T PopulateFromJson<T>(this T obj)
        {
            using (var streamReader = new StreamReader("output.json"))
            {  
                var rawJsonToLoad = streamReader.ReadLine();
                obj = rawJsonToLoad.FromJson<T>();
            }

            return obj;
       }
  }

如果我使用以下代码......

var testJson = new MeterWalkOrder();
testJson.Meters.Add(new Meter() { SerialNumber = "Meter 1" });
testJson.Meters.Add(new Meter() { SerialNumber = "Meter 2" });
testJson.PopulateFromJson();

...

在PopulateFromJson之后我希望保留对象 - 但是因为fromJson返回一个新对象它不是 - 所以我的对象只包含距离JSON文件2米的距离,我实际上希望它们被添加到列表的末尾 - 在我希望使用现有对象不要创建新对象

0 个答案:

没有答案