2013-02-05 11 views
7

Mam JSON danych, które wygląda tak:Przetwarzanie przez JSON w Json.NET z nieznanymi nazwami własności

{ 
    "response":{ 
    "_token":"StringValue", 
    "code":"OK", 
    "user":{ 
    "userid":"2630944", 
    "firstname":"John", 
    "lastname":"Doe", 
    "reference":"999999999", 
    "guid":"StringValue", 
    "domainid":"99999", 
    "username":"jdoe", 
    "email":"[email protected]", 
    "passwordquestion":"", 
    "flags":"0", 
    "lastlogindate":"2013-02-05T17:54:06.31Z", 
    "creationdate":"2011-04-15T14:40:07.22Z", 
    "version":"3753", 
    "data":{ 
     "aliasname":{ 
     "$value":"John Doe" 
     }, 
     "smsaddress":{ 
     "$value":"[email protected]" 
     }, 
     "blti":{ 
     "hideemail":"false", 
     "hidefullname":"false" 
     }, 
     "notify":{ 
     "grades":{ 
      "$value":"0" 
      }, 
      "messages":{ 
      "$value":"1" 
      } 
     }, 
     "beta_component_courseplanexpress_1":{ 
     "$value":"true" 
     } 
    } 
    } 
} 

używam C# z Json.NET analizować poprzez danych. Byłem w stanie z powodzeniem uzyskać dane za pomocą tego algorytmu:

User MyUser = new User(); 
JToken data = JObject.Parse(json); 
MyUser.FirstName = (string) data.SelectToken("response.user.firstname"); 
//The same for all the other properties. 

Problem jest z polem data. To pole jest oparte głównie na preferencjach użytkownika, a dane są wstawiane tylko wtedy, gdy są używane. Wszystkie pola są niestandardowe, a programiści mogą umieszczać dowolną liczbę bez ograniczeń. Zasadniczo to wszystkie dane w wolnym formularzu. Zauważ, że można je zagnieżdżać naprawdę daleko w danych.

Próbowałem uruchomić:

MyUser.Data = JsonConvert.DeserializeObject<List<JToken>>((string) data.SelectToken("response.user.data"); 

który nie działa.

Jak byś go przekonwertował, aby był użyty w obiekcie C#?

+0

@KenKin Aktualnie szukam Słownika do przechowywania danych. Pozostałe zmienne składowe są po prostu właściwościami łańcuchowymi, co sprawia, że ​​dostęp do nich za pomocą MyUser.FirstName jest naprawdę łatwy. Pytanie naprawdę koncentruje się na części "danych" JSON, reszta jest czysto tam dla odniesienia. – claydiffrient

Odpowiedz

11

można uzyskać do niego dostęp za pośrednictwem JToken/JArray/JObject metod. Na przykład wyświetli listę wszystkich kluczy pod danymi:

public class StackOverflow_14714085 
{ 
    const string JSON = @"{ 
          ""response"": { 
          ""_token"": ""StringValue"", 
          ""code"": ""OK"", 
          ""user"": { 
           ""userid"": ""2630944"", 
           ""firstname"": ""John"", 
           ""lastname"": ""Doe"", 
           ""reference"": ""999999999"", 
           ""guid"": ""StringValue"", 
           ""domainid"": ""99999"", 
           ""username"": ""jdoe"", 
           ""email"": ""[email protected]"", 
           ""passwordquestion"": """", 
           ""flags"": ""0"", 
           ""lastlogindate"": ""2013-02-05T17:54:06.31Z"", 
           ""creationdate"": ""2011-04-15T14:40:07.22Z"", 
           ""version"": ""3753"", 
           ""data"": { 
           ""aliasname"": { 
            ""$value"": ""John Doe"" 
           }, 
           ""smsaddress"": { 
            ""$value"": ""[email protected]"" 
           }, 
           ""blti"": { 
            ""hideemail"": ""false"", 
            ""hidefullname"": ""false"" 
           }, 
           ""notify"": { 
            ""grades"": { 
            ""$value"": ""0"" 
            }, 
            ""messages"": { 
            ""$value"": ""1"" 
            } 
           }, 
           ""beta_component_courseplanexpress_1"": { 
            ""$value"": ""true"" 
           } 
           } 
          } 
          } 
         }"; 

    public static void Test() 
    { 
     var jo = JObject.Parse(JSON); 
     var data = (JObject)jo["response"]["user"]["data"]; 
     foreach (var item in data) 
     { 
      Console.WriteLine("{0}: {1}", item.Key, item.Value); 
     } 
    } 
} 
+0

Jak dotąd ta metoda wygląda najlepiej, jeśli chodzi o to, co próbuję zrobić. Mam zamiar zostawić to otwarte na chwilę, zanim przyjmuję to jako odpowiedź. – claydiffrient

10

Json.NET może rzeczywiście analizować dynamiczne, jeśli jest to przydatne. Co oznacza, że ​​możesz zrobić coś takiego.

dynamic parsedObject = JsonConvert.DeserializeObject("{ test: \"text-value\" }"); 

parsedObject["test"]; // "text-value" 
parsedObject.test; // "text-value" 
parsedObject.notHere; // null 

Edytuj: może być bardziej odpowiedni do iterowania wartości, jeśli nie wiesz, czego szukasz.

dynamic parsedObject = JsonConvert.DeserializeObject("{ test: { inner: \"text-value\" } }"); 
foreach (dynamic entry in parsedObject) 
{ 
    string name = entry.Name; // "test" 
    dynamic value = entry.Value; // { inner: "text-value" } 
} 
Powiązane problemy