2015-07-21 3 views
1

Я борюсь с предметом, который имеет много вариантов в этом форуме, но я не могу найти подходящий для меня вариант, и я думаю, что это из-за того, что мой JSON массив :(Я не эксперт, но мне уже удается «почти» получить конец .. Мне нужно получить значение «Status» и «listOfCredDetails».Как десериализовать массив JSON в C#

My JSON (называется responseFromServer):

{ 
"Status": { 
      "StatusCode":143, 
      "SubStatus":0, 
      "Description":"Ok" 
      }, 
"ListofCredDetails": 
        [{ 
        "Client":"a", 
        "CredID":111, 
        "CredUserID":"abc" 
        }, 
        { 
        "Client":"b", 
        "CredID":112, 
        "CredUserID":"def" 
        }, 
        { 
        "Client":"c", 
        "CredID":113, 
        "CredUserID":"ghi" 
        }] 
    } 

Затем, на основе большого количества примеров в этом форуме, принимая биты и куски я создал свои классы:

[Serializable] 
public class StatusReturn 
    { 
     public int StatusCode { get; set; } 
     public int SubStatus { get; set; } 
     public string Description { get; set; } 
    } 


[Serializable] 
public class CredDetailsReturn 
{ 
    public string Client{ get; set; } 
    public int CredID{ get; set; } 
    public string CredUserID{ get; set; } 

} 

[Serializable] 
public class GetUserCredentialDetailsReturn 
{ 
    public StatusReturn status; 
    public List<CredDetailsReturn> listOfCredDetails; 

    public GetUserCredentialDetailsReturn() 
    { 
     status = new StatusReturn(); 
     listOfCredDetails = new List<CredDetailsReturn>(); 

    } 
} 

Тогда Собираюсь десериализации, чтобы получить

1. «Статус» и его элементы в один объект и

2. «ListofCredDetails» и его перечень элементов в один объект

, а затем создавая объект для «GetUserCredentialDetailsReturn», чтобы одновременно возвращать как статус (объект), так и ListofCredDetails (объект).

Может ли кто-нибудь помочь мне понять, как я могу достичь этого, я попробовал некоторые, как показано ниже, для десериализации и получения данных Json в два отдельных объекта.

Но он не работает ....

public GetUserCredentialDetailsReturn InvokeRequest(RESTInvokeClass objInvoke) 
    { 

     ... 
     ... 
     using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) 
     { 

      string responseText = streamReader.ReadToEnd(); 

      GetUserCredentialDetailsReturn result = new GetUserCredentialDetailsReturn(); 
      result.status = JsonConvert.DeserializeObject<StatusReturn>(responseText); 
      result.listOfCredDetails = JsonConvert.DeserializeObject<List<CredDetailsReturn>>(responseText); 

      return result; 

     } 

    } 
+3

Вы должны делать это: GetUserCredentialDetailsReturn result = JsonConvert.DeserializeObject (responseText) '. И удалите строки 'result.status = ...'и' result.listOfCredDetails = ... ' – Rob

+0

@ rob ... Мне не нужен полный JSON для десериализации в один объект. Мне нужна часть данных« Состояние »в JSON в один объект и« ListofCredDetails »(список) часть данных в JSON в другой объект. – Shravan

+0

Обычно гораздо проще десериализовать полный текст JSON и просто получить доступ к тем элементам, которые вам нужны. В противном случае, если вам действительно нужны только отдельные элементы, вам нужно использовать компоненты нижнего уровня библиотеки JSON: самостоятельно анализируйте поток токенов, отслеживайте дерево объектов и возвращайте только те элементы, которые вам нужны. – DrKoch

ответ

0

Вам необходимо сначала изменить имена своих свойств в классе GetUserCredentialDetailsReturn как статус статуса и listOfCredDetails в ListofCredDetails.

Затем вы можете попробовать де-сериализовать свой Json в свой класс GetUserCredentialDetailsReturn по коду ниже.

GetUserCredentialDetailsReturn result = new GetUserCredentialDetailsReturn(); 
result = JsonConvert.DeserializeObject<GetUserCredentialDetailsReturn>(responseText); 

В результате вы можете получить свой статус и listOfCredDetails.

// result.Status 
    // result.ListofCredDetails 

Надеюсь, это будет вам полезно.

0
[Serializable] 
public class GetUserCredentialDetailsReturn 
{ 
    public StatusReturn status { get; set; } 
    public List<CredDetailsReturn> listOfCredDetails { get; set; } 
} 

JsonConvert.Deserialize<GetUserCredentialDetailsReturn>(json_string) 
0

Если вам нужны только некоторые отдельные элементы (скажем, очень большой) JSON файла вам необходимо детали нижнего уровня библиотеки JSON, например, из Newtonsoft:

using Newtonsoft.Json; 

Затем создать анализатор, который читает через JSON лексем:

var reader = new JsonTextReader(...); 

Вы получите маркер на маркер:

private void nextToken() 
    { 
     do 
     { 
      if (!reader.Read()) this.importError("unexpected end of file"); 
     } 
     while (reader.TokenType == JsonToken.Comment); 
    } 

и должны справиться с этим в маркере Parser. Например, если вы читаете массив:

private void readMyArray() 
    { 
     // StartArray 
     if (reader.TokenType != JsonToken.StartArray) this.importError("expected start of array '['"); 
     this.nextToken(); 

     while (reader.TokenType != JsonToken.EndArray) 
     { 
      this.readMyElement(); 
     }    
     // EndArray 
     if (reader.TokenType != JsonToken.EndArray) this.importError("expected end of array ']'"); 
     this.nextToken(); 
    } 

Этот метод объясняется в каждой книге о компиляторе здания.

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