1

誰かがこの形式でjsonを逆シリアル化する適切な方法を手伝ってくれますか:

[
    {person: {name: "James", age:26}},
    {person: {name: "Mary", age:36}},
    {person: {name: "Kofi", age:46}}
]

私が使用しているコードは以下のとおりです。

WebRequest request = WebRequest.Create("url");
WebResponse response = request.GetResponse();

string json;

using (var sr = new StreamReader(response.GetResponseStream()))
{
    json = sr.ReadToEnd();
}

var serializer = new JavaScriptSerializer();

var persons= serializer.Deserialize<List<response>>(json);

foreach (var item in persons)
{
    Console.Write("name:" + item.name + " and age: " + item.age);
}

私がマッピングしているクラスは以下のとおりです。

public class person
{
    public string name{get;set;}
    public int age{get; set;}
}

public class response
{
   public person person {get;set;}
}

このコードを実行すると、名前と年齢のプロパティに null と空の文字列が表示され続けます。誰かが私を助けてくれれば、とても感謝しています。

4

5 に答える 5

5

組み込みのDataContractJsonSerializerクラスを使用することも可能です。例を参照してください:

WebRequest request = WebRequest.Create("url");
WebResponse response = request.GetResponse();

using (Stream stream = response.GetResponseStream())
{
   Type serializationTargetType = typeof(List<person>);
   DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(serializationTargetType);

   List<person> jsonDeserialized = (List<person>)jsonSerializer.ReadObject(stream);
}
于 2012-07-26T08:56:58.053 に答える
3

解決

私の解決策は非常に簡単ですが、次のものをインストールしておく必要があります。

nuget json

using Newtonsoft.Json;

var url = "http://your-url";
var json = JsonConvert.DeserializeObject<Person[]>(new WebClient().DownloadString(url));

List<Person> users = new List<Person>();

foreach (var user in json)
{
    users.Add(new Person()
    {
        name = user.name,
        age = user.age
    });
}
于 2012-07-26T08:38:44.047 に答える
2

JSON 構造を反映するモデルを定義できます。

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class Row
{
    public Person Person { get; set; }
}

次に、行の配列に逆シリアル化します。

var serializer = new JavaScriptSerializer();
var rows = serializer.Deserialize<Row[]>(json);
foreach (var row in rows)
{
    Console.Write("name: {0} and age: {1}", row.Person.Name, row.Person.Age);
}
于 2012-07-26T09:26:15.853 に答える
1

foreach ループで item.person.name と item.person.age を呼び出し、person クラスのすべてのプロパティが文字列型であることを確認する必要がありました。

于 2012-07-26T09:32:37.090 に答える
0

Web サーバーからの応答を逆シリアル化する必要がある場合は、これらすべてを一緒に行うフレームワークを使用します。

http://restsharp.org/を使用しましたが、うまく機能します。

于 2012-07-26T09:13:50.830 に答える