2012-05-10 3 views
4

Я пытаюсь десериализации JSON в этом формате:Использование JObject и JProperty с JSON.Net 4,0

{ 
    "data": [ 
     { 
     "installed": 1, 
     "user_likes": 1, 
     "user_education_history": 1, 
     "friends_education_history": 1, 
     "bookmarked": 1 
     } 
    ] 
} 

в простой массив строк, как это:

{ 
    "installed", 
    "user_likes", 
    "user_education_history", 
    "friends_education_history", 
    "bookmarked" 
} 

с использованием JSON.NET 4.0

Я получил его для работы с использованием «CustomCreationConverter»

public class ListConverter : CustomCreationConverter<List<string>> 
{ 
public override List<string> Create(Type objectType) 
{ 
    return new List<string>(); 
} 

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
{ 
    var lst = new List<string>(); 

    //don't care about the inital 'data' element 
    reader.Read(); 

    while (reader.Read()) 
    { 
     if (reader.TokenType == JsonToken.PropertyName) 
     { 
      lst.Add(reader.Value.ToString()); 
     } 
    } 
    return lst; 
} 
} 

но это действительно похоже на излишний, особенно если я хочу создать его для разных ответов json.

Я попытался с помощью JObject, но это не кажется, что я делаю это правильно:

List<string> lst = new List<string>(); 
JObject j = JObject.Parse(json_string); 
foreach (JProperty p in j.SelectToken("data").Children().Children()) 
{ 
    lst.Add(p.Name); 
} 

Есть ли лучший способ сделать это?

ответ

5

Есть много способов сделать это, и то, что у вас есть, хорошо. Несколько других альтернатив приведены ниже:

  • Получить первый элемент массива, а не всех детей
  • Используйте SelectToken, чтобы перейти к первому элементу массива с помощью одного вызова

    string json = @"{ 
         ""data"": [ 
         { 
          ""installed"": 1, 
          ""user_likes"": 1, 
          ""user_education_history"": 1, 
          ""friends_education_history"": 1, 
          ""bookmarked"": 1 
         } 
         ] 
        }"; 
    
        JObject j = JObject.Parse(json); 
    
        // Directly traversing the graph 
        var lst = j["data"][0].Select(jp => ((JProperty)jp).Name).ToList(); 
        Console.WriteLine(string.Join("--", lst)); 
    
        // Using SelectToken 
        lst = j.SelectToken("data[0]").Children<JProperty>().Select(p => p.Name).ToList(); 
        Console.WriteLine(string.Join("--", lst)); 
    
+0

Есть ли разница между этими двумя способами в производительности или чем-либо еще? – Clox

+2

Если есть, я думаю, что, вероятно, будет незначительным. Но, как всегда, попробуйте в своем сценарии, измерите его и решите сами. – carlosfigueira

Смежные вопросы