2012-01-29 7 views
0

これを行うことができないのかどうかは分かりませんが、基本的にはC#オブジェクトをjsonフィードにマッピングするのが難しいです。Json.netが暗黙的にノードを設定する

問題はjsonのテキストには実際には一意のIDであるオブジェクト名が含まれているため、マッピングに単一のオブジェクトを使用することができません。

{ 
    "Persons": { 
     "12345": { 
      "surname": "smith", 
      "firstname": "jim" 
      "language": "en" 
     }, 
     "99999": { 
      "surname": "blog", 
      "firstname": "joe" 
      "language": "en" 
     }, 
     "87534": { 
      "surname": "bond", 
      "firstname": "james" 
      "language": "en" 
     } 
    } 
} 

オブジェクト構造には、IListプロパティを含むPersonsというクラスがあります。

オブジェクト名は実際には一意のIDですが、同じタイプである可能性があります。 私はjsonフィードを制御できないので、単純にその終わりを編集することはできません。

これをjson.netで修正する方法はありますか?多分属性ですか?

+0

は、私はあなたが 'JsonConvert.SerializeObjectを()'使用していることを正しくあなたを理解していますか?手動でJSONを作成しても問題ありませんか? – svick

+0

これは 'List'よりも' Dictionary'のようなものです。 –

答えて

0

私はJSON.NETユーザーではありませんので、これが該当しない場合はお詫び申し上げます。あなたのJSONの構造は、それがより良いPersonが定義されているDictionary<int, Person>コレクションマッチすることが表示されます:

public class Person 
{ 
    public string surname { get; set; } 
    public string firstname { get; set; } 
    public string language { get; set; } 
} 

を階層的なデータ構造は、通常List<T>コレクションとうまく噛み合うません。

0

私は自分自身でJSON.NETを発見したので、私が言うことが100%正確であるかどうかは分かりません。あなたが指摘したように、入力文字列は適切なJSONではないので、シリアライゼーションコードを使用することはできません。

あなたがしたいことは、いくつかの前処理を行い、そのリストを適切な形式にしてから作業を進めることです。 LINQはJSONへのLINQは、必要に応じて個々の要素を操作できるので、これに対する完璧なソリューションと思われます。だから、プロパティ名をとり、 "id"を含む新しいオブジェクト型を作り直すことができます。その値は、以前使われていたプロパティ名と一致する値になります。

私は、これはあなたが欲しいものだと思う:

private void Test1() 
    { 
     string testInput = @"{ 
           ""Persons"": { 
            ""12345"": { 
             ""surname"": ""smith"", 
             ""firstname"": ""jim"", 
             ""language"": ""en"" 
            }, 
            ""99999"": { 
             ""surname"": ""blog"", 
             ""firstname"": ""joe"", 
             ""language"": ""en"" 
            }, 
            ""87534"": { 
             ""surname"": ""bond"", 
             ""firstname"": ""james"", 
             ""language"": ""en"" 
            } 
           } 
          }"; 

     JObject jsonPeople = JObject.Parse(testInput); 

     var query = from p in jsonPeople[ "Persons" ].Children().Cast<JProperty>() 
        select new JObject( 
         new object[] { new JProperty("id", p.Name) } 
         .Concat(p.Value.Children())); 

     JObject outJson = new JObject(new JProperty("Persons", query)); 

     System.Diagnostics.Debug.Print(outJson.ToString()); 
    } 
関連する問題