私は、組織図の従業員を表す一般的なツリー構造を持っています。ジェネリックツリーからJSON
ツリーは、ツリー内の自分のレベルを示すレベル、親、sibilingsなどお互いおよび他の特性への参照を持っているカスタムNode<Person>
オブジェクトのグラフから成り、等
私はこの部分をシリアル化する必要が特定のPersonからその下の全員を対象とした組織図を作成し、ノードオブジェクトにSelfAndDescendants()
というメソッドを持ち、IEnumerable<Node<Person>>
を返します。
基本的に私は特定の人物のNode
をツリーに配置し、それらの子孫すべてをIEnumerable
に入れます。この部分はうまく動作します。
それは私が立ち往生している場所です。今私はこのIEnumerable
Nodes
のセットを階層JSONにする必要があります。
私の最初の試みは、JSONシリアライザで直接スローするだけでしたが、これは一般的なNode
オブジェクトのセットであるため動作しませんでした(実際には期待しませんでした)。 Node
オブジェクトにValue
プロパティがあり、Person
オブジェクトを返します...これはJSON(名前のみ)に入るために必要なものです。
string json = JsonConvert.SerializeObject(personNode.SelfAndDescendants.ToList());
これは明らかに私は必要なものではありません。この時点でList<Node<Person>>
をシリアル化しようとしています。すべてのJSONリターンのニーズは、単純にPerson
オブジェクトのName
という階層形式です。他に何もない。
カスタムJSONをビルドして返すために、ここでループで何か手動で行う必要がありますか?
これはthis postの複製ではありません。私はここでは一般的な再帰的なツリーを扱っているので、単純な汎用データ構造ではありません。
カスタムJsonConverter
を実装する必要がありますか?これは一連のNode
オブジェクトではどのように動作しますか?
Nodeクラスは、プロパティのすべての種類を持っているが、それは基本的に次のようになります。
public class Node<T> : IEqualityComparer, IEnumerable<T>, IEnumerable<Node<T>> {
public Node(T value) {
Value = value;
}
public Node<T> this[int index] {
get {
return _children[index];
}
}
public Node<T> Add(T value, int index = -1) {
var childNode = new Node<T>(value);
Add(childNode, index);
return childNode;
}
public IEnumerable<Node<T>> SelfAndDescendants {
get {
return this.ToIEnumarable().Concat(Children.SelectMany(c => c.SelfAndDescendants));
}
}
}
Personクラスは人を表すだけでPOCOクラスです。このクラスは、すでにシステムの別の部分でJSONに正しくシリアル化されています。
[JsonObject]
public class Person {
public string Title { get; set; }
public DateTime DateOfBirth { get; set; }
[JsonConverter(typeof(StringEnumConverter))]
public Gender Gender { get; set; }
public List<StreetAddress> Addresses { get; set; }
... etc
}
希望する出力は、組織図で、JSONのユーザーのレベルを示しています。従業員の上司、上司の上司など。
JSONはこの点で非常に単純です。それは人名とタイトルです。従業員1人当たりの文字列でも構いません。
は 'Node'直列化可能ですか?もしそうなら、元の 'Node'オブジェクトがあなたが望む構造を持つように思えます。 'SelfAndDescendants'は構造を平坦化するように聞こえます。 'Node'と' Person'のコードを提供するだけでなく、他の人が利用できるように目的のJSON構造体を提供すると役に立ちます。 –
@Layoric私は質問を更新して、NodeクラスとPersonクラスに関するさらに詳しい情報を追加しました。どんな助けもありがとう。 JSONが階層構造内にたくさんの人の名前を必要とするだけで、この複雑なNodeクラスをどのように扱うのか分かりません。はるかに単純なクラスを作成し、すべてのデータを移動してシリアル化できると考えましたが、わかりません。 – Patrick
あなたは 'Node'クラスを制御できますか? –