public class Triple { public Triple(string _S, string _P, string _O) { this._S = _S; this._P = _P; this._O = _O; } public string _S { set; get; } public string _P { set; get; } public string _O { set; get; } }
function
static void TripleTransferJson(string _S, ref JObject obj) { if (list == null || list.Count == 0) return; List<Triple> sublist = list.Where(a => a._S == _S).ToList(); obj.Add("PrimaryKey", _S); //get property Count Dictionary<string, int> dt = GetPropertyCount(sublist); foreach (var item in sublist) { if (item._O.StartsWith(""") && dt[item._P] == 1) obj.Add(item._P, item._O); if (item._O.StartsWith(""") && dt[item._P] > 1) { if (obj.ContainsKey(item._P)) ((JArray)obj[item._P]).Add(item._O); else obj.Add(item._P, new JArray(item._O)); } sublist = list.Where(a => a._S == item._O).ToList(); JObject jObj = new JObject(); TripleTransferJson(item._O, ref jObj); if (dt[item._P] == 1 && !item._O.StartsWith(""")) obj.Add(item._P, jObj); if (dt[item._P] > 1 && !item._O.StartsWith(""")) { if (obj.ContainsKey(item._P)) ((JArray)obj[item._P]).Add(jObj); else obj.Add(item._P, new JArray(jObj)); } } } static Dictionary<string, int> GetPropertyCount(List<Triple> list) { if (list == null || list.Count == 0) return null; Dictionary<string, int> dt = new Dictionary<string, int>(); var pc = from p in list group p by p._P into g select new { property = g.Key, count = g.Count() }; foreach (var item in pc) { dt.Add(item.property, item.count); } return dt; }
test data
list.Add(new Triple("http://knowledge.microsoft.com/sfesfesfefs", "type.object.name", ""Wangshuang")); list.Add(new Triple("http://knowledge.microsoft.com/sfesfesfefs", "type.object.type", ""people.person")); list.Add(new Triple("http://knowledge.microsoft.com/sfesfesfefs", "type.object.gender", ""female")); list.Add(new Triple("http://knowledge.microsoft.com/sfesfesfefs", "type.object.name", ""sky")); list.Add(new Triple("http://knowledge.microsoft.com/sfesfesfefs", "type.object.image", "http://knowledge.microsoft.com/sfesfesfefd")); list.Add(new Triple("http://knowledge.microsoft.com/sfesfesfefs", "type.object.image", "http://knowledge.microsoft.com/sfesfesfef3")); list.Add(new Triple("http://knowledge.microsoft.com/sfesfesfefd", "type.object.type", ""common.image")); list.Add(new Triple("http://knowledge.microsoft.com/sfesfesfef3", "type.object.type", ""common.image")); list.Add(new Triple("http://knowledge.microsoft.com/sfesfesfefd", "type.image.uri", ""http://www.baidu.com")); list.Add(new Triple("http://knowledge.microsoft.com/sfesfesfef3", "type.image.uri", ""http://www.baidu.com")); JObject obj = new JObject(); TripleTransferJson("http://knowledge.microsoft.com/sfesfesfefs", ref obj); string json = obj.ToString();
test result
{ "PrimaryKey": "http://knowledge.microsoft.com/sfesfesfefs", "type.object.name": [ ""Wangshuang", ""sky" ], "type.object.type": ""people.person", "type.object.gender": ""female", "type.object.image": [ { "PrimaryKey": "http://knowledge.microsoft.com/sfesfesfefd", "type.object.type": ""common.image", "type.image.uri": ""http://www.baidu.com" }, { "PrimaryKey": "http://knowledge.microsoft.com/sfesfesfef3", "type.object.type": ""common.image", "type.image.uri": ""http://www.baidu.com" } ] }