C# 可能需要重新查看配置参数以满足需要
但下面的示例显示了完成工作的方法C# 可能需要重新查看配置参数以满足需要,c#,.net,json,json.net,C#,.net,Json,Json.net,但下面的示例显示了完成工作的方法 using (var r = new ChoJSONReader("*** YOUR JSON FILE ***") .WithJSONPath("$..Results[*]") ) { var r1 = r.FlattenBy("owners", "address"); var dt = r1.AsDataTable(selectedFields: new string[] { "Make_ID", "Model_ID", "n
using (var r = new ChoJSONReader("*** YOUR JSON FILE ***")
.WithJSONPath("$..Results[*]")
)
{
var r1 = r.FlattenBy("owners", "address");
var dt = r1.AsDataTable(selectedFields: new string[] { "Make_ID", "Model_ID", "name", "city" });
Console.WriteLine(dt.DumpAsJson());
}
输出:
希望能有所帮助。我不知道您还在寻找更好的解决方案。这是一个使用开源库的解决方案 您可能需要重新查看配置参数以满足需要 但下面的示例显示了完成工作的方法
using (var r = new ChoJSONReader("*** YOUR JSON FILE ***")
.WithJSONPath("$..Results[*]")
)
{
var r1 = r.FlattenBy("owners", "address");
var dt = r1.AsDataTable(selectedFields: new string[] { "Make_ID", "Model_ID", "name", "city" });
Console.WriteLine(dt.DumpAsJson());
}
输出:
希望能有所帮助。可能是我忘了提到json是动态的,所以不能有类模型可能是我忘了提到json是动态的,所以不能有类模型如果没有为用户“Balaji”定义地址,这将无法按预期工作,我们可以去掉这一行“var count=jo.SelectTokens”(“Results[*]Make\u ID”).Count();”。bcz路径是动态的。如果没有为用户“Balaji”定义地址,则该路径将无法按预期工作,我们是否可以删除该行“var count=jo.SelectTokens(“Results[*].Make_ID”).count();”。bcz路径是动态的。E是解决方案,仍在寻找更好的解决方案。这里是解决方案,仍在寻找更好的解决方案。
string xmlConfig = File.ReadAllText(@"C:\Temp\xmlConfig.txt");
XmlSerializer serializer = new XmlSerializer(typeof(DataTableConfig));
StringReader stringReader = new StringReader(xmlConfig);
DataTableConfig config = (DataTableConfig)serializer.Deserialize(stringReader);
DataTable dataTable = new DataTable();
foreach (Property p in config.Property)
{
dataTable.Columns.Add(p.Name);
}
dataTable.Columns.Add("Path"); //can be removed after building the table
string jdata = File.ReadAllText(@"C:\Temp\json.txt");
JObject json = JObject.Parse(jdata);
foreach (Property p in config.Property)
{
var jTokens = json.SelectTokens(p.Path);
foreach (JToken token in jTokens)
{
string parentPath = token.Parent.Parent.Path;
string searchExpression = $"Path = '{parentPath}'";
DataRow[] foundRows = dataTable.Select(searchExpression);
if (foundRows.Count() > 0)
{
string value = token.Value<string>();
foundRows[0][p.Name] = value;
}
else
{
string value = token.Value<string>();
DataRow toInsert = dataTable.NewRow();
toInsert[p.Name] = value;
toInsert["Path"] = parentPath;
dataTable.Rows.Add(toInsert);
}
}
}
foreach (DataRow row in dataTable.Rows)
{
StringWriter sw = new System.IO.StringWriter();
foreach (DataColumn col in dataTable.Columns)
sw.Write(row[col].ToString() + "\t");
string output = sw.ToString();
Console.WriteLine(output);
}
Console.ReadLine();
string jdata = File.ReadAllText(@"C:\Temp\json.txt");
Response response = JsonConvert.DeserializeObject<Response>(jdata);
response.Results.ForEach(x => x.ToList().ForEach(owner => dataTable.Rows.Add(owner.ToArray())));
dataTable
.Rows
.Cast<DataRow>().ToList()
.ForEach(x =>
{
dataTable.Columns.Cast<DataColumn>().ToList()
.ForEach(y => Console.Write($"{x[y].ToString()}\t")); Console.WriteLine();
});
public class Response
{
public int Count { get; set; }
public string Message { get; set; }
public string SearchCriteria { get; set; }
public List<Result> Results { get; set; }
}
public class Result
{
public List<List<string>> ToList()
{
List<List<string>> response = new List<List<string>>();
Owners.ForEach(x => response.Add(new List<string>() { MakeId, ModelId, x.Name, string.Join(",", x.Addresses.Select(address => address.City)) }));
return response;
}
[JsonProperty("Make_ID")]
public string MakeId { get; set; }
[JsonProperty("Model_ID")]
public string ModelId { get; set; }
[JsonProperty("Make_Name")]
public string MakeName { get; set; }
[JsonProperty("Model_Name")]
public string ModelName { get; set; }
[JsonProperty("owners")]
public List<Owner> Owners { get; set; }
}
public class Owner
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("address")]
public List<Address> Addresses { get; set; }
}
public class Address
{
[JsonProperty("city")]
public string City { get; set; }
[JsonProperty("pincode")]
public string PinCode { get; set; }
}
474 1861 Balaji kcp
474 1861 Rajesh chennai
475 1862 Vijay madurai
475 1862 Andrej Berlin
var regex = new Regex(Regex.Escape("*"));
var jo = JObject.Parse(response);
var count = jo.SelectTokens("Results[*].Make_ID").Count();
// Parse the Json to form collections of KeyValuePairs
var dataCollection = Enumerable.Range(0,count)
.Select(x=>config.Property
.Select(prop=>new KeyValuePair<string,List<string>>
(
prop.Name,
jo.SelectTokens(regex.Replace(prop.Path, x.ToString(), 1)).Select(c=>c.Value<string>()).ToList())));
// Flatten the collection and Create DataRows
foreach(var data in dataCollection)
{
for(var i=0;i<data.Select(x=>x.Value).Max(x=>x.Count);i++)
{
var innerList = new List<object>();
foreach(var prop in config.Property)
{
var currentData = data.Where(x=>x.Key == prop.Name).SelectMany(x=>x.Value).ToList();
innerList.Add(i>=currentData.Count ? currentData.Last():currentData[i]);
}
dataTable.Rows.Add(innerList.ToArray());
}
}
using (var r = new ChoJSONReader("*** YOUR JSON FILE ***")
.WithJSONPath("$..Results[*]")
)
{
var r1 = r.FlattenBy("owners", "address");
var dt = r1.AsDataTable(selectedFields: new string[] { "Make_ID", "Model_ID", "name", "city" });
Console.WriteLine(dt.DumpAsJson());
}