3

そのため、複雑なオブジェクト .NET を JSON のまったく異なるオブジェクトに変換しようとしています。基本的に、基本クラスから派生した任意のタイプのオブジェクトの配列があり、そのオブジェクトの配列を独自の JSON オブジェクトに変換したいと考えています。JSON オブジェクトの構造が異なるため、単純な JsonConvert.Serialize() メソッド呼び出しだけでは実行できないと思います。

これが私の .NET クラスのモックアップです。

public abstract class A
{
   public string Id { get; set; }
   public string Title { get; set; }
   public bool Enabled { get; set; }
   public List<X> MyCollection { get; set; }
}

public class B : A
{
   public string Foo { get; set; }
}

public class C : A
{
   public int Bar { get; set; }
}

public abstract class X
{
   public string Id { get; set; }
   public string Title { get; set; }
   public bool Enabled { get; set; }
}

public class Y : X
{
   public string Hello { get; set; }
}

public class Z : X
{
   public string World { get; set; }
}

明らかに、これは実際のクラス構造の単純なビューですが、これを変換する方法に関するガイダンスが実際のクラスを変換できるようになることを願っています。基本的に、私のクラス (A、B、C) にはクラス (X、Y、C) のリストが含まれます。

したがって、上にリストしたこれらのオブジェクトの配列/コレクションがあるとしましょう。

List<A> myObjects = new List<A>();
A myVar = new B();
myVar.Title = "Number 1";
myVar.MyCollection.Add(new Y());
myVar.MyCollection.Add(new Y());
myVar.MyCollection.Add(new Z());
myObjects.Add(myVar);

myVar = new B();
myVar.Title = "Number 2";
myVar.MyCollection.Add(new Z());
myObjects.Add(myVar);

myVar = new C();
myVar.Title = "Number 3";
myVar.MyCollection.Add(new Y());
myVar.MyCollection.Add(new Y());
myObjects.Add(myVar);

オブジェクト「myObjects」を取得して、次のような JSON 構造にシリアル化します。

[
   {
      name: "Number 1", //This is the value of A.Title
      type: "B", //This is a NEW property I want to add to the JSON
      enabled: true, //This is the value of A.Enabled
      foo: "SomeValue", //This is the value of B.Foo
      myCollection: [
         { name: "Y1", type: "Y", enabled: true, hello: "SomeValue" }
         { name: "Y2", type: "Y", enabled: true, hello: "SomeOtherValue" }
         { name: "Z1", type: "Z", enabled: true, world: "SomeValue" }
      ]
   },
   {
      name: "Number 2",
      type: "B",
      enabled: true,
      foo: "SomeValue",
      myCollection: [
         { name: "Z2", type: "Z", enabled: true, world: "SomeValue" }
      ]
   },
   {
      name: "Number 3",
      type: "C",
      enabled: true,
      bar: "SomeValue",
      myCollection: [
         { name: "Y3", type: "Y", enabled: true, hello: "SomeValue" }
         { name: "Y4", type: "Y", enabled: true, hello: "SomeOtherValue" }
      ]
   }
]

基本的に、独自のプロパティを追加して、.NET オブジェクトが反映するものとは少し異なる JSON で構造化したいと考えています。オブジェクトに追加したいプロパティが他にもいくつかありますが、ここにはリストされていません (これはさらに大きくなる可能性があります)。基本的には、オブジェクトを取得して独自のカスタム方法でシリアル化する方法が必要なだけです。ただし、これらのプロパティの一部を引き継ぐことができるように、派生型をシリアル化する必要があります。この問題を解決する方法について、誰かが私を正しい方向に導くのを手伝ってくれますか?

4

1 に答える 1

0

Json.Linq クラスを使用して、プライマリ クラスを逆シリアル化した後に型を読み取ることにより、それらを動的に逆シリアル化できます。

var objects = JArray.Parse(jsonString)
List<A> objectList = new List<A>();
foreach (var obj in objects) {
    A newObj = null;
    switch ((string)obj["type"]) {
        case "B":
            newObj = obj.ToObject<B>();
            break;
        case "C":
            newObj = obj.ToObject<C>();
            break;
    }
    newObj.MyCollection.Clear();
    foreach (var x in obj["myCollection"]) {
        var newX = null;
        switch ((string)x["type"]) {
            case "Y":
                newX = x.ToObject<Y>();
                break;
            case "Z":
                newX = x.ToObject<Z>();
                break;
        }
        newObj.MyCollection.Add(newX);
    }
    objectList.Add(newObj);
}

あなたが投稿したJsonを処理することができると私が知る限り、エラーがある場合は、申し訳ありませんが、タブレットのメモリから完全にこれを行いました:P

于 2013-02-08T05:58:56.850 に答える