2

私はバックエンドとして主に C# を持つプロジェクトに取り組んでいますが、私は経験豊富な C# 開発者ではないため、オブジェクトのリストの json の逆シリアル化を修正する方法を見つけることができません。次の関数は逆シリアル化を処理するものですが、エラーが発生します:

using System.IO;
using System.Web;
using Raven.Imports.Newtonsoft.Json;

namespace Corina.Web.Handlers
{
    public class JsonRequestHandler
    {
        public T Handle<T>(HttpContextBase context)
        {
            string requestData;

            context.Request.InputStream.Position = 0;
            using (var inputStream = new StreamReader(context.Request.InputStream))
            {
                requestData = inputStream.ReadToEnd();
            }

            return JsonConvert.DeserializeObject<T>(requestData, new Raven.Imports.Newtonsoft.Json.Converters.StringEnumConverter());           
        }
    }
}

Error:

現在の JSON 配列 ([1,2,3] など) を型 'Corina.Web.Views.DocumentViewModel' に逆シリアル化できません。型が正しく逆シリアル化するには JSON オブジェクト ({"name":"value"} など) が必要なためです。

このエラーを修正するには、JSON を JSON オブジェクト (例: {"name":"value"}) に変更するか、逆シリアル化された型を配列または List のようなコレクション インターフェイス (ICollection、IList など) を実装する型に変更します。 JSON 配列から逆シリアル化されます。JsonArrayAttribute を型に追加して、強制的に JSON 配列から逆シリアル化することもできます。

オブジェクトの代わりにオブジェクトのリストで逆シリアル化を行う方法を教えてもらえますか?

4

2 に答える 2

4

このクラスを作成し、以下のようなメソッドを作成する必要があります:

   public class Demo
   {
      public string Name;
      public string Type;
      public string Value;
      public string ChildContentType;
      public string ChildMetadata;
   }

    public void Deserialize()
    {
        string jsonObjString = "[{\"Name\": \"Description\",\"Type\": \"Text\",\"Value\": \"XXX\",\"ChildContentType\": \"Value\",\"C??hildMetadata\": \"YYY\"}]";
         var ser = new JavaScriptSerializer();
         var arreyDemoObj = ser.Deserialize<Demo[]>(jsonObjString);

         foreach (Demo objDemo in arreyDemoObj)
         {
             //Do what you want with objDemo
         }
      }

JavaScriptSerializerの参照を追加する必要があることに注意してください。

于 2013-02-27T12:48:51.523 に答える
0

あなたのjsonデータの構造はわかりませんが、次の方法で逆シリアル化できるDataContractJsonSerializerで逆シリアル化するためにいくつかのカスタムクラスを使用していると思います

Json リスト:

var testdata = "[{\"name\":\"numToRetrieve\",\"value\":\"3\",\"label\":\"Number of     items       to retrieve:\"},{\"name\":\"showFoo\",\"value\":\"on\",\"label\":\"Show foo?\"},  {\"name\":\"title\",\"value\":\"Foo\",\"label\":\"Foo:\"}]";

DataContractJsonSerializer js = 
new DataContractJsonSerializer(typeof (List<FooDef>));
var stream = new MemoryStream(Encoding.UTF8.GetBytes(testdata));
var foo = js.ReadObject(stream);
stream.Close();



[DataContract]
public sealed class FooDef
{
    [DataMember(Name = "name", IsRequired = true)]
    public string Name { get; set; }

    [DataMember(Name = "value", IsRequired = true)]
    public string Value { get; set; }

    [DataMember(Name = "label", IsRequired = true)]
    public string Label { get; set; }
} 
于 2013-02-27T12:26:40.953 に答える