2015-11-10 8 views
2

У меня есть JSON данные:JSON.NET десериализовать динамический объект

var decodedJson = 
"{{ 
    "user": { 
    "userId": "sid:C4F4E93856104F078A11FE95892F0158" 
    }, 
    "authenticationToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmdWxscm93IjoiYWxsIiwiRGJnMiI6ImxvZ2luIiwidmVyIjoiMyIsInVpZCI6InNpZDpDNEY0RTkzODU2MTA0RjA3OEExMUZFOTU4OTJGMDE1OCIsImlzcyI6InVybjptaWNyb3NvZnQ6d2luZG93cy1henVyZTp6dW1vIiwiYXVkIjoidXJuOm1pY3Jvc29mdDp3aW5kb3dzLWF6dXJlOnp1bW8iLCJleHAiOjE0NDk3NTYzNzIsIm5iZiI6MTQ0NzE2NDM3Mn0.kc-0O_aorfTw9l9U6yY6wyVtQnckqNBJikBzxAcJZ_U" 
}}"; 

Тогда я хочу десериализации динамически с помощью Json.NET:

var result = JsonConvert.DeserializeObject<dynamic>(decodedJson); 

Тогда я ожидаю, чтобы извлечь UserId и токен как это:

string userId = result.user.userId; 
string userToken = result.authenticationToken; 

Но это говорит

"Неизвестный пользователь член/authenticationToken"

Любые идеи?


ОБНОВЛЕНО:

Я скопировал неправильные данные JSON, это на самом деле должно быть так:

{\"user\":{\"userId\":\"sid:C4F4E93856104F078A11FE95892F0158\"},\"authenticationToken\":\"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmdWxscm93IjoiYWxsIiwiRGJnMiI6ImxvZ2luIiwidmVyIjoiMyIsInVpZCI6InNpZDpDNEY0RTkzODU2MTA0RjA3OEExMUZFOTU4OTJGMDE1OCIsImlzcyI6InVybjptaWNyb3NvZnQ6d2luZG93cy1henVyZTp6dW1vIiwiYXVkIjoidXJuOm1pY3Jvc29mdDp3aW5kb3dzLWF6dXJlOnp1bW8iLCJleHAiOjE0NDk3NjE1NDEsIm5iZiI6MTQ0NzE2OTU0MX0.oVH8R2134UQQDpXfzPv2mmrj7M05w2mzWtbp70i7GEU\"} 
+0

Поскольку вы знаете структуру JSON, может не ваша сериализация к стандартному типу? –

+0

@ArghyaC: данные jSon могут измениться в будущем. В любом случае, я выполнил этот образец кода из API Microsoft Azure https://azure.microsoft.com/en-gb/documentation/articles/app-service-api-dotnet-consume/ –

+1

Вы пытались удалить открывающиеся '{' и закрытие '}', у вас есть 2 в начале и в конце, и это незаконно в JSON. Вы также можете попробовать этот http: // stackoverflow.com/a/8972079/2096538 –

ответ

2

В конечном итоге вам лучше скопировать структуру в C#. Если ваша модель меняется в формат JSON, то вам придется изменить свой dynamic код в любом случае и ошибки легче ползать в.

следующих классов может быть использован для анализа вашего JSON после удаления дополнительных {} в начале и в конце ответ.

public class User 
{ 
    public string userId { get; set; } 
} 

public class RootObject 
{ 
    public User user { get; set; } 
    public string authenticationToken { get; set; } 
} 

Вы можете использовать следующий сайт для быстрого отображения JSON в Csharp

http://json2csharp.com/

+0

Спасибо. Я знаю это, но я просто следую инструкциям на странице примеров Microsoft и хочу знать, что с ним не так: https://azure.microsoft.com/en-gb/documentation/articles/app-service-api-dotnet-consume/ –

1

Похоже, у вас есть дополнительный набор фигурных скобок «{} «вокруг всего объекта в строке JSON. Вы пытались удалить их, чтобы увидеть, работает ли это?

Я наклеил вашу строку JSON на несколько веб-сайтов JSON formatters, и все они бросили ошибки, пока я не удалил внешние фигурные скобки.

+1

К OP - если вы получаете двойные фигурные скобки, вы можете удалить их, используя: 'jsonString = jsonString.Substring (1, jsonString.Length - 2); ' –

+0

Извините, я только что обновил вопрос –

1

Один из способов состоит в использовании Linq-to-JSON из Json.NET как этот

var jsonString = File.ReadAllText(@"C:\YourDirectory\user.json"); 
var jObjet = JObject.Parse(jsonString); 

string userId = (string)jObjet["user"]["userId"]; 
string userToken = (string)jObjet["authenticationToken"]; 

Если объект структуры изменения в будущем, вы можете передать новые имена string тегов в качестве параметра вашего метода.

Примечание Ваша JSON структура не является правильным, у вас есть дополнительный набор скобок {} вокруг объекта.