シナリオ:パーツのリストを含むExcelファイルをエクスポートする必要があります。ユーザーが列を選択して、エクスポートされたファイルで選択した列のデータのみを取得できるようにしました。これは動的レポートであるため、レポートをマップするために具象クラスを使用していません。これにより、レポート内の空の列ヘッダーがエクスポートされ、これは不要です。このシナリオを処理するために動的Linqを使用しています。
動的linqから取得した動的オブジェクトのリストがあります。
[
{"CleanPartNo":"Test","Description":"test","AliasPartNo":["258","145","2313","12322"]},
{"CleanPartNo":"Test1","Description":"test1","AliasPartNo":[]}
]
このjsonから4行をどのように取得できますか?
強く型付けされたオブジェクトを使用してJSON.Netを使用して逆シリアル化/マッピングできないことに注意してください
更新以下はコードです:
public class Part
{
public int Id { get; set; }
public string CleanPartNo { get; set; }
public string Description { get; set; }
public List<PartAlias> AliasPartNo { get; set; }
}
public class PartAlias
{
public int PartId { get; set; }
public int PartAliasId { get; set; }
public string AliasPartNo { get; set; }
}
var aliases = new List<PartAlias> {
new PartAlias{AliasPartNo="258" },
new PartAlias{AliasPartNo="145" },
new PartAlias{AliasPartNo="2313" },
new PartAlias{AliasPartNo="12322" }
};
List<Part> results = new List<Part> {
new Part{CleanPartNo="Test", Description= "test", PartAlias=aliases },
new Part{CleanPartNo="Test1", Description= "test1" }
};
var filters = "CleanPartNo,Description, PartAlias.Select(AliasPartNo) as AliasPartNo";
var dynamicObject = JsonConvert.SerializeObject(results.AsQueryable().Select($"new ({filters})"));
dynamicObject変数で、上記のjsonを取得します
あなたが提供したjsonから、このように名前でグループ化された値を取得できます:
var array = JArray.Parse(json);
var lookup = array.SelectMany(x => x.Children<JProperty>()).ToLookup(x => x.Name, x => x.Value);
これは、Excel列を埋めるためのルックアップに対する単純なループの単なる方法です。
ただし、JSONの前にフラット化を行うことをお勧めします。配列である列の名前を知らなくてもそれを実現するためにしばらく試してみましたが、失敗しました。それはあなたの仕事なので、これ以上試しません:P
ここでの最良の方法は、配列であるプロパティのオブジェクトを乗算するだけのカスタムコンバーターを実装することだと思います。あなたがそれをうまくやれば、あなたは完全に無料で無限のレベルを手に入れるでしょう。