2016-04-16 25 views
0

Ich habe eine DLL erstellt, die eine Anfrage auf meiner API ausführen. Jetzt die Anfrage senden Sie mir eine Antwort JSON, was ich tun will (von der DLL), ist ein Array von Objekt zurück, um in dem Programm verwendet werden, das die DLL implementiert. Jetzt habe ich diese Klasse:Wie erstellt man ein Array von Objekten?

public class Details 
{ 
    public string name { get; set; } 
    public string age { get; set; } 
} 

public class Info 
{ 
    public List<object> info { get; set; } 
} 

public class User 
{ 
    public Details details { get; set; } 
    public Info info { get; set; } 
} 

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

ich deserialisieren die Anfrage wie folgt aus:

var obj = JsonConvert.DeserializeObject<List<RootObject>>("json returned"); 

Nun ist die json enthält die details des Benutzers, und in einigen Fällen auch die info, so dass ich durchlaufen davon auf diese Weise:

foreach(var user in obj) 
{ 
    item.user.details.name; 
    //take some info (could not contain nothing) 
    foreach(var info in user.info.info) 
    { 
     info; //<- contains all the information 
    } 
} 

Was ich wissen möchte ist: Wie kann ich eine Liste von Objekt erstellen? Insbesondere möchte ich das Objekt user zurücksenden, das als Eigenschaft details und info hat. Das Ergebnis sollte ein Array von Objekt ‚Ursache sein, der das Objekt reiceve muß durch es iterieren und jede Objekteigenschaft lesen als:

user[0].details.name: //where 0 is the index of the user (php syntax) 

Ich weiß nicht, ob in C# möglich ist, könnte jemand mir helfen, dieses Ziel erreichen?

+1

Sie möchten eine Liste von alle Benutzerobjekte? Versuchen Sie dies: 'var users = obj.Select (x => x.user). ToArray();' –

Antwort

3

Ihr Json-Konverter gibt List<RootObject> zurück, und jede RootObject enthält nur eine Eigenschaft: user. Eine einfache Linq Abfrage würde die List<RootObject> in ein List<User> Objekt ändern:

var users = obj.Select(o => o.user).ToList(); 

Jedes Element in users ist dann ein User, sowohl mit der Details und Info Eigenschaft.

Als ein Beispiel für die Verwendung dieser Methode sollten Sie eine Methode verwenden, die die Konvertierung von json ausführt, und Sie möchten, dass diese Methode die Liste der Benutzer zurückgibt. Das Verfahren würde wie folgt aussehen:

public List<User> GetUsersFromJson() 
{ 
    var obj = JsonConvert.DeserializeObject<List<RootObject>>("json returned"); 
    var users = obj.Select(o => o.user).ToList(); 
    return users; 
} 

Sie können den Benutzer durchlaufen wie dieses Objekt:

foreach (var user in users) 
{ 
    var detail = user.details; 
    var info = user.info; 
} 

Sie sollten sich überlegen Ihren öffentlichen Eigenschaften camel-case ändern, wie in C# gängige Praxis ist.

+1

Nur ein kleiner Syntaxfehler: ersetzen '>' mit ')' –

+0

sollte ich die Methode als öffentliche Liste deklarieren '? – Dillinger

+0

Die Linq-Abfrage ist keine Methode für sich. Sie können es überall in Ihrem Code hinzufügen, um die Konvertierung durchzuführen.Die Methode, in die Sie es eingebettet haben, kann öffentlich, privat oder was auch immer sein, abhängig von Ihrem Design. –

1

JsonConvert.DeserializeObject> gibt die Liste von RootObject zurück. Sie können die Methode ToArray() verwenden, um die Liste in ein Array zu ändern.

In diesem Fall:

var obj = JsonConvert.DeserializeObject<List<RootObject>>("json returned"); 
RootObject[] array = obj.ToArray(); 

string s = array[0].user.details.name; 
object[] infos = array[0].user.info.info.ToArray(); 

und in diesem Code:

foreach(var user in obj) 
{ 
    item.user.details.name; 
    //take some info (could not contain nothing) 
    foreach(var info in user.info.info) 
    { 
     info; //<- contains all the information 
    } 
} 

sens nicht haben, sollte es so sein:

foreach (RootObject elem in obj) 
{ 
    foreach (Info info in elem.user.info.info) 
    { 
     object[] localInfo = info.info.ToArray(); //<- contains all the information 
    } 
} 
Verwandte Themen