2017-11-25 22 views
3

ファイルに数千のjsonオブジェクトがあります。 idで重複したエントリを削除することでそれをきれいにしたいでしょう。Cでファイル内の重複JSONオブジェクトを削除します

JSONファイル構造:

{ 
"quote": [{ 
"id":1, 
"title": "Mahatma Gandhi", 
"quote":"A man is but a product of his thoughts. What he thinks he becomes.", 
"videourl": "https://www.youtube.com/watch?v=2GgK_Nq9NLw", 
"websiteurl":"http://www.mkgandhi.org/", 
"otherurl":"https://en.wikipedia.org/wiki/Mahatma_Gandhi", 
"updatedon":"19-Aug-2017", 
"username":"[email protected]", 
"details":"Mohandas Karamchand Gandhi (2 October 1869 – 30 January 1948), commonly known as Mahatma Gandhi (Sanskrit: महात्मा mahātmā 'Great Soul'). In India he is generally regarded as Bapu (Gujarati: બાપુ bāpu 'father'), Jathi Pitha and Raashtra Pita; he was an advocate and pioneer of nonviolent social protest and direct action in the form he called Satyagraha. He led the struggle for India's independence from British colonial rule." 
}, 
{ 
"id":2, 
"title": "Ernest Hemingway", 
"quote":"The world breaks everyone, and afterward, some are strong at the broken places.", 
"videourl": "https://www.youtube.com/watch?v=35vrg7a64nY", 
"websiteurl":"https://www.biography.com/people/ernest-hemingway-9334498", 
"otherurl":"https://en.wikipedia.org/wiki/Ernest_Hemingway", 
"updatedon":"20-Aug-2017", 
"username":"[email protected]", 
"details":"Ernest Miller Hemingway was an American novelist, short story writer, and journalist. His economical and understated style had a strong influence on 20th-century fiction, while his life of adventure and his public image influenced later generations." 
}, 
... 
] 

私は引用エ​​ンティティを作成し、LINQのを使用して重複を見つけ、C#で、バックストリームを書くために、オブジェクトをデシリアライズします。完了するまでにはかなりの時間がかかります。

他の効果的な方法をご提案ください。

編集: 私が試したコード同梱、

string json = ""; 

using (StreamReader file = File.OpenText(@"D:\motivation-pyramid\data\demo\quote.json")) 
{ 
    json = file.ReadToEnd(); 
} 

var managedObjectCollection = JsonConvert.DeserializeObject<ManagedObjectCollection>(json); 

var distinctManagedObjects = managedObjectCollection.quote.GroupBy(a => a.quote).Select(b => b.First()); 

json = JsonConvert.SerializeObject(distinctManagedObjects.ToArray()); 

File.WriteAllText(@"D:\motivation-pyramid\data\demo\quote.json", json); 
+1

あなたが試したコードを投稿できますか?数千のエンティティは処理するのに数秒しかかかりません。あなたのコードにボトルネックとなるものがあるかもしれません –

+1

それを逆シリアル化するためにあなたは何を使用していますか?どちらの部分が本当に長くかかります、デシリアライゼーションまたは書き戻し(または両方)? –

+0

私はコードを追加しました。より多くの時間がかかるのはLinqクエリです。 –

答えて

3

Netwonsoft Json.NETライブラリを使用するが、これはかなり容易に達成することができます。

JObject jObj = JObject.Parse(json_string); 

List<JToken> uni = jObj["quote"].GroupBy(x => x["id"]).Select(x => x.First()).ToList(); 

for (Int32 i = jObj["quote"].Count() - 1; i >= 0; --i) 
{ 
    JToken token = jObj["quote"][i]; 

    if (!uni.Contains(token)) 
     token.Remove(); 
} 

は、あなたがそのライブラリをしたくない場合は、あなたのJSONたらデータは、次のLINQ式を使用してリストにシリアライズされます。

list.DistinctBy(x => x.ID).ToList(); 

またはMoreLINQ:

list.DistinctBy(x => x.ID).ToList(); 
関連する問題