2016-07-18 7 views
2

私は現在C#で作業しています。JSON.Netを使ってJSON文字列をよく解析しています。私の問題の一部は、私はこのようないくつかの文字列を取得していますということです。マッチする中括弧で文字列を分割する最も良い方法

{"name": "John"}{"name": "Joe"} 

私はJsonConvert.DeserializeObject<>をデシリアライズしようとすると、それが例外をスローします。

この大きな文字列をより小さなjson文字列に分割するにはどうすればよいでしょうか。

「レベル0」という文字列と中括弧を照合することを考えていました。これはいい考えのようですか?または、これを行うためのより良い方法がいくつかありますか?

+0

あなたからこのJSONを得るのですか? –

+0

彼らは私が取り組んでいる練習から私に与えられたいくつかのテストケースです。 – Benjamin

+3

これは有効なJsonではありませんが、小さな変更でも可能です{{"name": "John"}、{"name": "Joe"}] –

答えて

7

あなたはSupportMultipleContentフラグを設定してJsonTextReaderを使用することができますこの非標準のJSONを読むためにはtrueにしてください。

class Person 
{ 
    public string Name { get; set; } 
} 

あなたはこのようにJSONオブジェクトをデシリアライズすることができます:あなたはこのようになりますクラスPersonを持っていると仮定すると

string json = @"{""name"": ""John""}{""name"": ""Joe""}"; 

using (StringReader sr = new StringReader(json)) 
using (JsonTextReader reader = new JsonTextReader(sr)) 
{ 
    reader.SupportMultipleContent = true; 

    var serializer = new JsonSerializer(); 
    while (reader.Read()) 
    { 
     if (reader.TokenType == JsonToken.StartObject) 
     { 
      Person p = serializer.Deserialize<Person>(reader); 
      Console.WriteLine(p.Name); 
     } 
    } 
} 

フィドル:https://dotnetfiddle.net/1lTU2v

+0

これは最も効果的でした。ありがとう! – Benjamin

+0

うれしい私は助けることができました。 –

2

私は最善の方法は、アレイ構造にあなたの文字列を変換することですが見つかりました:

string json = "{\"name\": \"John\"}{\"name\": \"Joe\"}"; 

json = json.Insert(json.Length, "]").Insert(0, "[").Replace("}{", "},{"); 

// json now is  [{"name": "John"},{"name": "Joe"}] 
List<Person> result = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Person>>(json); 

あなたのクラス名がPersonであると仮定すると:

public class Person 
{ 
    public string Name { set; get; } 
} 
+0

私が提供したサンプルは、中括弧。 2つまたは3つのレベルがある場合、これは機能しますか? – Benjamin

+0

@Benjaminはあなたが得ることができる最も複雑な例を掲載しています。私はそれを試して喜んでくれるでしょう:) – user3185569

関連する問題