2012-02-08 8 views
1

に変換する必要があります。次の2つのクラスがあります。json.netはクラスプロパティを

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は配列ではなく単一のオブジェクトとして認識されます。

json.netでこれを行うことはできますか?

答えて

1
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); 
+0

どのようなハックで簡単な解決策。大好きです。それについてHaventは考えました。属性またはSerializerSettingsを持つより洗練されたソリューションがある場合は、質問を開いたままにしておきます。 – Syska

+0

@Syskaこの答えを守りたいとは思っていませんが、もう少しです。Attributesなどのソリューションは、別の種類のシリアライザに移植可能であるかもしれません。だから自由をシリアライザを自由に選ぶようにしたいのであれば、消費者が望むようにオブジェクトを構造化する必要があります。あなたはそれを変えることで(@ scottmの答え)、またはそれを包むことによって(私の答え) –

+0

私はそれを持っています。それで、なぜ私も "属性またはSerializerSettings"を書いた。属性を使用すると、私はJson.NETに依存することになりますが、他の人は自由と他のものが彼らの望む方法を連想させることができます。消費者はArgsを配列として必要とします。しかし、この文脈では、消費する製品がこれを配列として必要とする理由はありません。しかし、これは固い解決策のようです。最初に、jsonデシリアライザにバグがあったと思っていましたが、それは私のコードでした:-(。 – Syska

1

だけBarの配列にあなたの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); 
+0

は最も正しい答えはそう、これはきれいな私のモデルを維持しますオイゲンRieckに行くと考えてください。しかし、まったく同じ簡単な答えです。 – Syska