2016-04-15 60 views
2

我有2個JSON文件,或字符串,我想基於ID合併它們。像加入SQL一樣。這是例子:合併2個JSON文件Newtonsoft

這是Json的1:

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

這個我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 
    }] 
} 

我希望它在一個JSON文件或字符串基於這樣的ID合併結構:

{ 
    "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" : [] 
     } 
    ] 
} 

我試了一整天,仍然沒有發現任何東西。你有什麼想法如何與Newtonsoft做到這一點?或者其他方式?但我喜歡用牛頓軟件。

+1

你可以創建你的JSON的C#對象表示,並有Newtonsoft把JSON字符串轉換爲對象,然後使用LINQ來執行你的加入到一個新的對象,最後使用Newtsonsoft重新序列化的新對象回JSON。 – mituw16

+2

這是一個很好的要求。那麼,當你在編寫代碼時,你的代碼發生了什麼? – Will

回答

1

你可以用LINQ to JSON做到這一點,利用ToLookup()找到所有公民對於給定的城市:

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"]]); 
} 

原型fiddle

要從文件加載JSON,稍後再保存,請參閱Read JSON from a fileWrite JSON to a file

+0

你是我的英雄。有效。謝謝。 :d – coldfire