C# 查询及;合并来自多个JSON文件的数据

C# 查询及;合并来自多个JSON文件的数据,c#,json,.net,json.net,jsonpath,C#,Json,.net,Json.net,Jsonpath,我正在尝试查询和合并多个JSON文件的内容。目标是打开每个文件,将其加载到JArray中,并使用JSONPath查询数据。然后获取queryResults[n]并将它们合并到一个新的JSON文件中。下面是一个(希望清楚)的例子 文件A(人员): 文件B(组): 文件C(预期结果): 理想情况下,我希望通过JSONPath和JSON.NET(Newtonsoft)尽可能多地完成这项工作。假设文件A和文件B都是Jarray。但我真的不知道如何编写这样的JSONPath表达式来查询每个表达式,然后合并

我正在尝试查询和合并多个JSON文件的内容。目标是打开每个文件,将其加载到JArray中,并使用JSONPath查询数据。然后获取queryResults[n]并将它们合并到一个新的JSON文件中。下面是一个(希望清楚)的例子

文件A(人员):

文件B(组):

文件C(预期结果):


理想情况下,我希望通过JSONPath和JSON.NET(Newtonsoft)尽可能多地完成这项工作。假设文件A和文件B都是Jarray。但我真的不知道如何编写这样的JSONPath表达式来查询每个表达式,然后合并结果。是否可能,如果可能,如何实现?

我会使用
Linq

var peopleList = JArray.Parse(peopleJson);

var groupList = JArray.Parse(groupJson);

var expectedResult = peopleList.Select(s => new
{
    Id = s["Id"].ToString(),
    Name = new { First = s["Name"]["First"].ToString() },
    GroupDescription = groupList.FirstOrDefault(f => f["Id"].ToString() == s["GroupId"].ToString())["Description"].ToString()

}).ToList();

我会使用
Linq

var peopleList = JArray.Parse(peopleJson);

var groupList = JArray.Parse(groupJson);

var expectedResult = peopleList.Select(s => new
{
    Id = s["Id"].ToString(),
    Name = new { First = s["Name"]["First"].ToString() },
    GroupDescription = groupList.FirstOrDefault(f => f["Id"].ToString() == s["GroupId"].ToString())["Description"].ToString()

}).ToList();

使用Newtonsoft.Json.Linq的名称空间
具有用于Json操作的有用实用程序。您可以使用诸如
JObject
JProperty
之类的原语构建JSON对象或数组。这将使您免于反序列化和重新序列化:

    var json1 = "[\r\n  {\r\n    \"Id\": 1,\r\n    \"GroupId\": 5,\r\n    \"Name\": {\r\n      \"First\": \"Tony\",\r\n      \"Last\": \"Stark\"\r\n    },\r\n    \"Phone\": \"1111111111\"\r\n  },\r\n  {\r\n    \"Id\": 2,\r\n    \"GroupId\": 5,\r\n    \"Name\": {\r\n      \"First\": \"Steve\",\r\n      \"Last\": \"Rogers\"\r\n    },\r\n    \"Phone\": \"2222222222\"\r\n  },\r\n  {\r\n    \"Id\": 3,\r\n    \"GroupId\": 6,\r\n    \"Name\": {\r\n      \"First\": \"John\",\r\n      \"Last\": \"Doe\"\r\n    },\r\n    \"Phone\": \"3333333333\"\r\n  }\r\n]";
    var json2 = "[\r\n  {\r\n    \"Id\": 5,\r\n    \"Description\": \"Avengers\"\r\n  },\r\n  {\r\n    \"Id\": 6,\r\n    \"Description\": \"Others\"\r\n  }\r\n]";
    var mainArray = JArray.Parse(json1);
    var groupArray = JArray.Parse(json2);
    var targetArray = new JArray();
    foreach (JObject o in mainArray)
    {
        var id = o.Value<int>("GroupId");
        var target = groupArray.FirstOrDefault(r => r.Value<int>("Id") == id);
        if (target == null)
            continue;
        var newObj = new JObject();
        newObj["Id"] = id;
        var name = new JObject(new JProperty("Last",o["Name"]["Last"]));
        newObj["Name"] = name;
        newObj["GroupDescription"] = target["Description"];
        targetArray.Add(newObj);
    }
    var targetJson = targetArray.ToString();
目前,该国的主要施工人员在1.5\r\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\r\n\n\n\n\n\r\n\n\n\r\n\n\n\r\n\n\n\r\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n缔约缔约缔约1.1.1.1.1.1.1.1.1.1-1.1.1.1.1.1.1.1.1.1\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\\n\”电话\“:\“2222222\”\r\n}、\r\n{\r\n“Id\”:3、\r\n“GroupId\”:6、\r\n“Name\”:{\r\n“First\”:“John\”、\r\n“Last\”:“Doe\”\r\n}、\r\n“Phone\:“3333333\”\r\n}\r\n; var json2=“[\r\n{\r\n\“Id\”:5、\r\n\“Description\”:“复仇者”\r\n}、\r\n{\r\n\“Id\”:6、\r\n\“Description\”:“其他人”\r\n}\r\n]; var mainArray=JArray.Parse(json1); var groupArray=JArray.Parse(json2); var targetArray=new JArray(); foreach(主阵列中的JObject o) { var id=o.Value(“GroupId”); var target=groupArray.FirstOrDefault(r=>r.Value(“Id”)==Id); if(target==null) 继续; var newObj=newjobject(); newObj[“Id”]=Id; var name=new JObject(new JProperty(“Last”,o[“name”][“Last”]); newObj[“Name”]=名称; newObj[“GroupDescription”]=目标[“Description”]; targetaray.Add(newObj); } var targetJson=targetArray.ToString();

使用Newtonsoft.Json.Linq的名称空间
具有用于Json操作的有用实用程序。您可以使用诸如
JObject
JProperty
之类的原语构建JSON对象或数组。这将使您免于反序列化和重新序列化:

    var json1 = "[\r\n  {\r\n    \"Id\": 1,\r\n    \"GroupId\": 5,\r\n    \"Name\": {\r\n      \"First\": \"Tony\",\r\n      \"Last\": \"Stark\"\r\n    },\r\n    \"Phone\": \"1111111111\"\r\n  },\r\n  {\r\n    \"Id\": 2,\r\n    \"GroupId\": 5,\r\n    \"Name\": {\r\n      \"First\": \"Steve\",\r\n      \"Last\": \"Rogers\"\r\n    },\r\n    \"Phone\": \"2222222222\"\r\n  },\r\n  {\r\n    \"Id\": 3,\r\n    \"GroupId\": 6,\r\n    \"Name\": {\r\n      \"First\": \"John\",\r\n      \"Last\": \"Doe\"\r\n    },\r\n    \"Phone\": \"3333333333\"\r\n  }\r\n]";
    var json2 = "[\r\n  {\r\n    \"Id\": 5,\r\n    \"Description\": \"Avengers\"\r\n  },\r\n  {\r\n    \"Id\": 6,\r\n    \"Description\": \"Others\"\r\n  }\r\n]";
    var mainArray = JArray.Parse(json1);
    var groupArray = JArray.Parse(json2);
    var targetArray = new JArray();
    foreach (JObject o in mainArray)
    {
        var id = o.Value<int>("GroupId");
        var target = groupArray.FirstOrDefault(r => r.Value<int>("Id") == id);
        if (target == null)
            continue;
        var newObj = new JObject();
        newObj["Id"] = id;
        var name = new JObject(new JProperty("Last",o["Name"]["Last"]));
        newObj["Name"] = name;
        newObj["GroupDescription"] = target["Description"];
        targetArray.Add(newObj);
    }
    var targetJson = targetArray.ToString();
目前,该国的主要施工人员在1.5\r\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\r\n\n\n\n\n\r\n\n\n\r\n\n\n\r\n\n\n\r\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n缔约缔约缔约1.1.1.1.1.1.1.1.1.1-1.1.1.1.1.1.1.1.1.1\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\\n\”电话\“:\“2222222\”\r\n}、\r\n{\r\n“Id\”:3、\r\n“GroupId\”:6、\r\n“Name\”:{\r\n“First\”:“John\”、\r\n“Last\”:“Doe\”\r\n}、\r\n“Phone\:“3333333\”\r\n}\r\n; var json2=“[\r\n{\r\n\“Id\”:5、\r\n\“Description\”:“复仇者”\r\n}、\r\n{\r\n\“Id\”:6、\r\n\“Description\”:“其他人”\r\n}\r\n]; var mainArray=JArray.Parse(json1); var groupArray=JArray.Parse(json2); var targetArray=new JArray(); foreach(主阵列中的JObject o) { var id=o.Value(“GroupId”); var target=groupArray.FirstOrDefault(r=>r.Value(“Id”)==Id); if(target==null) 继续; var newObj=newjobject(); newObj[“Id”]=Id; var name=new JObject(new JProperty(“Last”,o[“name”][“Last”]); newObj[“Name”]=名称; newObj[“GroupDescription”]=目标[“Description”]; targetaray.Add(newObj); } var targetJson=targetArray.ToString();

是的,如果我提前知道结构,那就行了。我之所以尝试使用JSONPath,是因为文档结构和所需的输出只有在运行时才知道。我尝试一般地传入一些参数(比如JSONPath字符串和JSON文件的路径),然后动态生成结果?如果我们讨论的是传递参数,那么可以将参数传递给Linq,就像
groupList.FirstOrDefault(f=>f[parameter1].ToString()==s[parameter2].ToString()一样
。是的,如果我提前知道结构,那就行了。我之所以尝试使用JSONPath,是因为文档结构和所需的输出只有在运行时才知道。我尝试一般性地传入一些参数(如JSONPath字符串和JSON文件的路径)然后动态生成结果。在不知道结构的情况下,如何合并项?如果我们讨论的是传递参数,则可以将参数传递给Linq,就像
groupList.FirstOrDefault(f=>f[parameter1]。ToString()==s[parameter2]。ToString()
。请参阅我在上文中对@selim yildiz所作的评论-此外,性能很重要,但不是我现在最关心的问题。通用功能对此更为重要。请参阅我在上文中对@selim yildiz所作的评论-此外,性能很重要,但不是我现在最关心的问题。通用功能对此更为重要。
    var json1 = "[\r\n  {\r\n    \"Id\": 1,\r\n    \"GroupId\": 5,\r\n    \"Name\": {\r\n      \"First\": \"Tony\",\r\n      \"Last\": \"Stark\"\r\n    },\r\n    \"Phone\": \"1111111111\"\r\n  },\r\n  {\r\n    \"Id\": 2,\r\n    \"GroupId\": 5,\r\n    \"Name\": {\r\n      \"First\": \"Steve\",\r\n      \"Last\": \"Rogers\"\r\n    },\r\n    \"Phone\": \"2222222222\"\r\n  },\r\n  {\r\n    \"Id\": 3,\r\n    \"GroupId\": 6,\r\n    \"Name\": {\r\n      \"First\": \"John\",\r\n      \"Last\": \"Doe\"\r\n    },\r\n    \"Phone\": \"3333333333\"\r\n  }\r\n]";
    var json2 = "[\r\n  {\r\n    \"Id\": 5,\r\n    \"Description\": \"Avengers\"\r\n  },\r\n  {\r\n    \"Id\": 6,\r\n    \"Description\": \"Others\"\r\n  }\r\n]";
    var mainArray = JArray.Parse(json1);
    var groupArray = JArray.Parse(json2);
    var targetArray = new JArray();
    foreach (JObject o in mainArray)
    {
        var id = o.Value<int>("GroupId");
        var target = groupArray.FirstOrDefault(r => r.Value<int>("Id") == id);
        if (target == null)
            continue;
        var newObj = new JObject();
        newObj["Id"] = id;
        var name = new JObject(new JProperty("Last",o["Name"]["Last"]));
        newObj["Name"] = name;
        newObj["GroupDescription"] = target["Description"];
        targetArray.Add(newObj);
    }
    var targetJson = targetArray.ToString();