coldfire
coldfire

Reputation: 55

Merge 2 JSON Files Newtonsoft

I have 2 json files, or String and i want to merge them based on ID. Like join on sql. This is the example:

This is Json 1:

{
    "City": [{
        "CityId": 9,
        "CityName": "Kukes"
    }, {
        "CityId": 18,
        "CityName": "Tirana"
    }, {
        "CityId": 19,
        "CityName": "Vlore"
    }, {
        "CityId": 22,
        "CityName": "temp"
    }]
}

And this i json 2:

{
    "Citizen": [{
        "CitizenId": 38,
        "CitizenLastName": "Bale",
        "CitizenName": "Christian",
        "City_Id": 19
    }, {
        "CitizenId": 39,
        "CitizenLastName": "ttrtrt",
        "CitizenName": "test",
        "City_Id": 18
    }, {
        "CitizenId": 42,
        "CitizenLastName": "Freeman",
        "CitizenName": "Morgan",
        "City_Id": 9
    }, {
        "CitizenId": 43,
        "CitizenLastName": "Snow",
        "CitizenName": "Jon",
        "City_Id": 9
    }, {
        "CitizenId": 44,
        "CitizenLastName": "test2",
        "CitizenName": "test",
        "City_Id": 9
    }]
}

I want it to merge in a json file or string based on id like this structure:

{
    "City":
    [
        {
            "CityId":9,
            "CityName":"Kukes",
            "Citizens" : [{"CitizenId":42,"CitizenLastName":"Freeman","CitizenName":"Morgan","City_Id":9},{"CitizenId":43,"CitizenLastName":"Snow","CitizenName":"Jon","City_Id":9},{"CitizenId":44,"CitizenLastName":"test2","CitizenName":"test","City_Id":9}]
        },
        {
            "CityId":18,
            "CityName":"Tirana",
            "Citizens" : [{"CitizenId":39,"CitizenLastName":"ttrtrt","CitizenName":"test","City_Id":18}]
        },
        {
            "CityId":19,
            "CityName":"Vlore",
            "Citizens" : [{"CitizenId":38,"CitizenLastName":"Bale","CitizenName":"Christian","City_Id":19}]
        },
        {
            "CityId":22,
            "CityName":"temp",
            "Citizens" : []
        }
    ]
}

I've tried all day and still found nothing. Do you have any idea how to do this with Newtonsoft? Or any other way? But I'd like it with newtonsoft.

Upvotes: 2

Views: 585

Answers (1)

dbc
dbc

Reputation: 116615

You can do this with LINQ to JSON, using ToLookup() to find all citizens for a given city:

var cities = JToken.Parse(cityJson);
var citizens = JToken.Parse(citizenJson);

var lookup = citizens.SelectTokens("Citizen[*]").ToLookup(c => (string)c["City_Id"]);

foreach (var city in cities.SelectTokens("City[*]"))
{
    city["Citizens"] = new JArray(lookup[(string)city["CityId"]]);
}

Prototype fiddle.

To load your JSON from a file, then later save back, see Read JSON from a file and Write JSON to a file.

Upvotes: 1

Related Questions