2012-01-29 16 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" 
     } 
    } 
} 

我有的對象結構是一個名爲Persons的類,它包含一個IList屬性。

正如您所看到的,對象名稱實際上是唯一的ID,但可以是相同的類型。 我沒有控制JSON飼料,所以我不能簡單地編輯該結束。

有什麼我可以做的,以解決這個在json.net?也許屬性?

+0

我是否正確理解你,你使用'JsonConvert.SerializeObject()'?是手動爲你創建JSON嗎? – svick 2012-01-29 02:04:07

+0

這看起來更像是一個'Dictionary'而不是'List'。 – 2012-01-29 03:42:03

回答

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 to 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()); 
    }