2

Newtonsoft.Json を使用して以下を逆シリアル化しようとしています

{
    "max_id_str":"1234567",
    "results":[{
        "created_at":"Tue, 21 May 2013 03:06:23 +0000",
        "from_user":"Name Here",
        "from_user_id":33333,
        "text":"THE TEXT GOES HERE"
    }],
    "results_per_page":1,
    "since_id":0,
    "since_id_str":"0"
}

逆シリアル化を使用して max_id_str を取得できますが、「結果」のデータを取得できません

ここに私が持っているコードがあります

public class tweet
    {
        public string max_id_str { get; set; }
        public string text{ get; set; }
        public string results_per_page{ get; set; }
        public string since_id { get; set; }
        public string since_id_str { get; set; }
    }

次に、クラスのオブジェクトを作成し、それをオブジェクトにデシリアライズしようとします

tweet t = new tweet();
t = JsonConvert.DeserializeObject<tweet>(e.Result);

「テキスト」以外のすべてが入力されますか? 値を出力すると、テキストの値が null になります。私がしようとしていることを達成する方法はありますか?

4

2 に答える 2

4

そのJSON文字列をその型に逆シリアル化することを期待しているものtextはオブジェクトのプロパティではないので、そのようにすることを期待する理由はありません。 リストtext内のオブジェクトのプロパティです。resultsこれらのオブジェクトもマップしてから、オブジェクトを介してテキストにアクセスする必要がありresultます。

public class tweet
{
    public string max_id_str { get; set; }
    //public string text{ get; set; }
    public List<result> results { get; set; }
    public string results_per_page{ get; set; }
    public string since_id { get; set; }
    public string since_id_str { get; set; }
}

public class result
{
    public string created_at { get; set; }
    public string from_user { get; set; }
    public int from_user_id { get; set; }
    public string text { get; set; }
}

結果内の値を使用してテキスト プロパティの値を決定しようとしていた場合は、コンバーターを記述してテキスト値を抽出できますJsonPropertyプロパティにandJsonConverter属性を追加してtext、コンバーターを実装するだけです。

public class tweet
{
    public string max_id_str { get; set; }
    [JsonProperty("results")]
    [JsonConverter(typeof(TextPropertyResultExtractorConverter))]
    public string text { get; set; }
    public string results_per_page{ get; set; }
    public string since_id { get; set; }
    public string since_id_str { get; set; }
}

public class TextPropertyResultExtractorConverter : JsonConverter
{
    public override bool CanConvert(Type type)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var results = (JArray)serializer.Deserialize(reader);
        var result = results.First();
        return result.Value<string>("text");
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}
于 2013-05-21T04:08:42.470 に答える
1

これtextは、C# オブジェクトでは直接ツイートしているのに対し、子要素であるためです。resultsプロパティとしてオブジェクトがありません。デシリアライザーがこれらの値を配置する場所を知る方法はありません (対応するプロパティはありません)。

于 2013-05-21T04:04:48.107 に答える