0

次のクラスを使用して JSON を作成しました。

public class Detail
{
    public bool Correct { get; set; }
    public bool Response { get; set; }
    public HtmlText Text { get; set; }
    public string ImageFile { get; set; }
    public HtmlText Explanation { get; set; }
}

これを次のようにデシリアライズしたいと思います:

public class Answer
{  
    public bool Correct { get; set; }
    public bool Response { get; set; }
    public string Text { get; set; }
    public string ImageFile { get; set; }
    public string Explanation { get; set; }
}

これを行うには、次のものがあります。

public static string ToJSONString(this object obj)
{
    using (var stream = new MemoryStream())
    {
        var ser = new DataContractJsonSerializer(obj.GetType());
        ser.WriteObject(stream, obj);
        return Encoding.UTF8.GetString(stream.ToArray());
    }
}

これが私のデータのサンプルです:

[
  {"Correct":false,
   "Explanation":{"TextWithHtml":null},
   "ImageFile":null,
   "Response":false,
   "Text":{"TextWithHtml":"-1 1 -16 4"}
  },
  {"Correct":false,
   "Explanation":{"TextWithHtml":null},
   "ImageFile":null,
   "Response":false,
   "Text":{"TextWithHtml":"1 -1 -4 16"}
  },
  {"Correct":false,
   "Explanation":{"TextWithHtml":null},
   "ImageFile":null,
   "Response":false,
   "Text":{"TextWithHtml":"1 -1 4 2147483644"}
  }]

と私のコード:

IList<Answer> answers = JSON.FromJSONString<List<Answer>>(detailsJSON)

次のようなエラーメッセージが表示されます。

{"There was an error deserializing the object of type 
System.Collections.Generic.List`1[[Answer, Models, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]. 
End element 'Explanation' from namespace '' expected. Found element 'TextWithHtml' from namespace ''."} 
System.Exception {System.Runtime.Serialization.SerializationException}

これを変更して、HtmlText を通常の文字列に配置する簡単な方法はありますか?

4

1 に答える 1

0

簡単な調整は、次のような辞書を使用することです。

public class Answer
{
    public bool Correct { get; set; }
    public bool Response { get; set; }
    public Dictionary<string, string> Text { get; set; }
    public string ImageFile { get; set; }
    public Dictionary<string, string> Explanation { get; set; }
}

このような値に逆シリアル化してアクセスします。

var answers =  JsonConvert.DeserializeObject<List<Answer>>(detailsJSON);

foreach (var answer in answers)
{
  Console.WriteLine(answer.Text["TextWithHtml"]);
  Console.WriteLine(answer.Explanation["TextWithHtml"]);
}
于 2013-06-25T12:52:50.873 に答える