json.net需要将我的类属性转换为

json.net需要将我的类属性转换为,.net,json,.net,Json,我有以下两门课 public class Foo { public Bar Args { get; set; } public Foo() { Args = new Bar(); } } public class Bar { public string Name { get; set; } public int Age { get; set; } } 使用时: var foo = new Foo(); foo.Args.Nam

我有以下两门课

public class Foo
{
    public Bar Args { get; set; }

    public Foo()
    {
        Args = new Bar();
    }
}

public class Bar
{
    public string Name { get; set; }
    public int Age { get; set; }
}
使用时:

var foo = new Foo();
foo.Args.Name = "Mikael";
foo.Args.Age = 12;
string o = JsonConvert.SerializeObject(foo);
Console.WriteLine(o);
我得到以下json:

{"Args":{"Name":"Mikael","Age":12}}
我想这有点正确。。。但我将其发送到的另一端希望Args是一个数组,因此它需要如下所示:

{"Args":[{"Name":"Mikael","Age":12}]}
否则,它将Args视为单个对象而不是数组


这可以用吗?

只需将
Args
属性更改为
条的数组

public class Foo
{
    public Bar[] Args { get; set; }
}

    var foo = new Foo();
    foo.Args = new Bar[] { new Bar {Name = "Mikael", Age = 12}};

    string o = JsonConvert.SerializeObject(foo);
    Console.WriteLine(o);

这是一个多么简单的解决方案啊。我喜欢它。我没想过。如果有一个更优雅的带有属性或SerializerSettings的解决方案,这个问题仍然没有解决。@Syska不想为这个答案辩护,但还有一点:带有属性等的解决方案可能可移植到另一种序列化程序,也可能不可移植到另一种序列化程序。因此,如果您想保持自由选择序列化程序的自由,您需要按照消费者希望的方式构造对象。你可以通过改变它(@scottm的答案)或包装它(我的答案)来做到这一点,我对此感到敬畏。这就是为什么我还写了“属性或序列化设置”。对于属性,我将依赖于Json.NET,但对于另一个,我将拥有自由,其他人可以按照自己的意愿序列化。使用者希望Args作为数组。但在这种情况下,我看不出消费产品为什么要将其作为数组。但是这似乎是一种固溶体。首先,我认为json反序列化程序有一个bug,但这是我的代码:-(。我认为最正确的答案是Eugen Rieck,这样可以保持我的模型干净。但仍然是非常简单的答案。
public class FooWrapper
{
    private Foo myfoo;

    public Bar[] Args { get { 
      Bar[] bar=new Bar[1]();
      bar[0]=myfoo.Bar;
      return bar;
    }}

    public FooWrapper(Foo foo)
    {
        myfoo=foo;
    }
}

var foo = new Foo();
foo.Args.Name = "Mikael";
foo.Args.Age = 12;
string o = JsonConvert.SerializeObject(new FooWrapper(foo));
Console.WriteLine(o);