it-swarm.com.de

C # .net, wie komplexe Objekte von JSON deserialisiert werden

Ich habe einen JSON-String und brauche Hilfe, um ihn zu deserialisieren.

nichts hat für mich funktioniert .. das ist die JSON

{
    "response": [{
        "loopa": "81ED1A646S894309CA1746FD6B57E5BB46EC18D1FAff",
        "drupa": "D4492C3CCE7D6F839B2BASD2F08577F89A27B4ff",
        "images": [{
                "report": {
                    "nemo": "unknown"
                },
                "status": "rock",
                "id": "7e6ffe36e-8789e-4c235-87044-56378f08m30df",
                "market": 1
            },
            {
                "report": {
                    "nemo": "unknown"
                },
                "status": "rock",
                "id": "e50e99df3-59563-45673-afj79e-e3f47504sb55e2",
                "market": 1
            }
        ]
    }]
}

ich habe ein Beispiel für die Klassen, aber ich muss diese Klassen nicht verwenden, es macht mir nichts aus, einige andere Klassen zu verwenden ... die folgenden Klassen:

public class Report
{
    public string nemo { get; set; }
}

public class Image
{
    public Report report { get; set; }
    public string status { get; set; }
    public string id { get; set; }
    public int market { get; set; }
}

public class Response
{
    public string loopa { get; set; }
    public string drupa{ get; set; }
    public Image[] images { get; set; }
}

public class RootObject
{
    public Response[] response { get; set; }
}

Ich möchte erwähnen, dass ich Newtonsoft.Json bereits habe, damit ich einige Funktionen von dort verwenden kann.

wie kann ich das machen? danke.

22
Assaf Zigdon

Ich verwende das so in meinem Code und es funktioniert gut 

nachfolgend finden Sie einen Code, den Sie schreiben müssen 

using System.Web.Script.Serialization;

JavaScriptSerializer oJS = new JavaScriptSerializer();
RootObject oRootObject = new RootObject();
oRootObject = oJS.Deserialize<RootObject>(Your JSon String);
39
Javal Patel

Sollte einfach so sein:

var jobject = JsonConvert.DeserializeObject<RootObject>(jsonstring);

Sie können den Json-String hier einfügen: http://json2csharp.com/ , um zu überprüfen, ob Ihre Klassen korrekt sind.

32
stevepkr84

Wenn Sie C # 2010 oder neuer verwenden, können Sie dynamic type verwenden:

dynamic json = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonstring);

Dann können Sie auf Attribute und Arrays in dynamischen Objekten mithilfe der Punktnotation zugreifen:

string nemo = json.response[0].images[0].report.nemo;
16
filipko

Installieren Sie zuerst newtonsoft.json-Paket mit Visual Studio in NuGet Package Manager und fügen Sie dann den folgenden Code hinzu:

ClassName ObjectName = JsonConvert.DeserializeObject < ClassName > (jsonObject);
7
Tejas Jain

Ich hatte ein Szenario und dieses half mir

JObject objParserd = JObject. Parse (jsonString);

JObject arrayObject1 = (JObject) objParserd ["d"];

D myOutput = JsonConvert. DeserializeObject<D> (arrayObject1.ToString ());

3
Ozesh
 public static void Main(string[] args)
{
    string json = @" {
    ""children"": [
            {
        ""url"": ""foo.pdf"", 
                ""expanded"": false, 
                ""label"": ""E14288-Passive-40085-2014_09_26.pdf"", 
                ""last_modified"": ""2014-09-28T11:19:49.000Z"", 
                ""type"": 1, 
                ""size"": 60929
            }
        ]
     }";




    var result = JsonConvert.DeserializeObject<ChildrenRootObject>(json);
    DataTable tbl = DataTableFromObject(result.children);
}

public static DataTable DataTableFromObject<T>(IList<T> list)
{
    DataTable tbl = new DataTable();
    tbl.TableName = typeof(T).Name;

    var propertyInfos = typeof(T).GetProperties();
    List<string> columnNames = new List<string>();

    foreach (PropertyInfo propertyInfo in propertyInfos)
    {
        tbl.Columns.Add(propertyInfo.Name, propertyInfo.PropertyType);
        columnNames.Add(propertyInfo.Name);
    }

    foreach(var item in list)
    {
        DataRow row = tbl.NewRow();
        foreach (var name in columnNames)
        {
            row[name] = item.GetType().GetProperty(name).GetValue(item, null);
        }

        tbl.Rows.Add(row);
    }

    return tbl;
}

public class Child
{
    public string url { get; set; }
    public bool expanded { get; set; }
    public string label { get; set; }
    public DateTime last_modified { get; set; }
    public int type { get; set; }
    public int size { get; set; }
}

public class ChildrenRootObject
{
    public List<Child> children { get; set; }
}
2
user6845177

shareInfo ist Klasse:

public class ShareInfo
        {
            [JsonIgnore]
            public readonly DateTime Timestamp = DateTime.Now;
            [JsonProperty("sharename")]
            public string ShareName = null;
            [JsonProperty("readystate")]
            public string ReadyState = null;
            [JsonProperty("created")]
            [JsonConverter(typeof(Newtonsoft.Json.Converters.UnixDateTimeConverter))]
            public DateTime? CreatedUtc = null;
            [JsonProperty("title")]
            public string Title = null;
            [JsonProperty("getturl")]
            public string GettUrl = null;
            [JsonProperty("userid")]
            public string UserId = null;
            [JsonProperty("fullname")]
            public string Fullname = null;
            [JsonProperty("files")]
            public GettFile.FileInfo[] Files = new GettFile.FileInfo[0];
        }

// POST request.
            var gett = new WebClient { Encoding = Encoding.UTF8 };
            gett.Headers.Add("Content-Type", "application/json");
            byte[] request = Encoding.UTF8.GetBytes(jsonArgument.ToString());
            byte[] response = gett.UploadData(baseUri.Uri, request);

            // Response.
            var shareInfo = JsonConvert.DeserializeObject<ShareInfo>(Encoding.UTF8.GetString(response));
2
veeresh i

Ich hatte auch das Problem, JSON-Objekte in C # zu analysieren und zu verwenden. Ich habe den dynamischen Typ mit einigen Bibliotheken überprüft, aber es wurde immer geprüft, ob eine Eigenschaft vorhanden ist.

Am Ende bin ich auf diese Webseite gestoßen, was mir viel Zeit gespart hat. Es erstellt automatisch eine stark typisierte Klasse basierend auf Ihren JSON-Daten, die Sie mit der Newtonsoft-Bibliothek verwenden werden, und es funktioniert einwandfrei. Es funktioniert auch mit anderen Sprachen als C #.

1
davidthegrey

Ich verwende folgendes:

    using System.Web.Script.Serialization;       

    ...

    public static T ParseResponse<T>(string data)
    {
        return new JavaScriptSerializer().Deserialize<T>(data);
    }
0
Uzzy

Sie können Ihr Problem wie folgt lösen

public class Response
{
    public string loopa { get; set; }
    public string drupa{ get; set; }
    public Image[] images { get; set; }
}

public class RootObject<T>
    {
        public List<T> response{ get; set; }

    }

var des = (RootObject<Response>)Newtonsoft.Json.JsonConvert.DeserializeObject(Your JSon String, typeof(RootObject<Response>));
0

Ich habe dieses Problem gelöst, um einen öffentlichen Setter für alle Eigenschaften hinzuzufügen, der deserialisiert werden sollte.

0
everydayXpert