Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可能需要重新查看配置参数以满足需要_C#_.net_Json_Json.net - Fatal编程技术网

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());
}