使用 ChoETL 展平 Json 并忽略数组索引

Flatten Json & Ignore array index Using ChoETL

我有 1 个 json 文件和这些代码行: 这是我的代码:

  using (var r = new ChoJSONReader("data.json")
                                .Configure(c => c.ThrowAndStopOnMissingField = true)
                                .Configure(c => c.DefaultArrayHandling = true)
                                .Configure(c => c.FlattenNode = true)
                                .Configure(c => c.IgnoreArrayIndex = false)
                                .Configure(c => c.NestedKeySeparator = '.')
                                .Configure(c => c.NestedColumnSeparator = '.')
                )
            {
                var dt = r.AsDataTable();
                Console.WriteLine(dt.DumpAsJson());
            }

我的 data.json 文件:

{
  "BrandId": "998877665544332211",
  "Categories": [
    "112233445566778899"
  ],
  "Contact": {
    "Phone": [
      {
        "Value": "12346789",
        "Description": {
          "vi": "Phone"
        },
        "Type": 1
      },
      {
        "Value": "987654321",
        "Description": {
          "vi": "Phone"
        },
        "Type": 1
      }
    ]
  }
}

在 运行 这段代码之后,我得到了这样的输出:

[
  {
    "BrandId": "998877665544332211",
    "Contact.Phone.0.Value": "12346789",
    "Contact.Phone.0.Description.vi": "Phone",
    "Contact.Phone.0.Type": 1,
    "Contact.Phone.1.Value": "987654321",
    "Contact.Phone.1.Description.vi": "Phone",
    "Contact.Phone.1.Type": 1,
    "Category0": "112233445566778899"
  }
]

这里的问题是我怎样才能得到某种输出 json 在扁平化的关键节点上没有“0” 预期输出:

[
  {
    "BrandId": "998877665544332211",
    "Contact.Phone.Value": "12346789",
    "Contact.Phone.Description.vi": "Phone",
    "Contact.Phone.Type": 1,
    "Category": "112233445566778899"
  },
  {
    "BrandId": "998877665544332211",
    "Contact.Phone.Value": "987654321",
    "Contact.Phone.Description.vi": "Phone",
    "Contact.Phone.Type": 1,
    "Category": "112233445566778899"
  }
]

我研究了很多方法,但结果与我预期的结果不一样。 感谢您的帮助

由于您的 json 本质上是 nested/complex,您需要使用 ChoETL/Linq 解压并展平成多个简单的数据元素行,如下所示。

ChoETLSettings.KeySeparator = '-';
using (var r = ChoJSONReader.LoadText(json)
       .WithField("BrandId")
       .WithField("Category", jsonPath: "Categories[0]", isArray: false)
       .WithField("Phone", jsonPath: "Contact.Phone[*]")
      )
{
    var dt = r.SelectMany(rec => ((IList)rec.Phone).OfType<dynamic>().Select(rec1 => 
                                                                    {
                                                                        dynamic ret = new ChoDynamicObject();
                                                                        ret["BrandId"] = rec.BrandId;
                                                                        ret["Contact.Phone.Value"] = rec1.Value;
                                                                        ret["Contact.Phone.Description.vi"] = rec1.Description.vi;
                                                                        ret["Contact.Phone.Type"] = rec1.Type;
                                                                        ret["Category"] = rec.Category;
                                                                        return ret;
                                                                    })).AsDataTable();
    
    dt.DumpAsJson().Print();
}

示例 fiddle:https://dotnetfiddle.net/PHK8LO