使用[JsonConvert()]时,JSON.Net引发StackOverflow

我将这些简单的代码写为Serialize类,以使其扁平化,但是当我使用[JsonConverter(typeof(FJson))]批注时,它将引发StackOverflowException。如果我SerializeObject手动拨打电话,它可以正常工作。


如何在注释模式下使用JsonConvert:


class Program

    {

        static void Main(string[] args)

        {

            A a = new A();

            a.id = 1;

            a.b.name = "value";


            string json = null;


            // json = JsonConvert.SerializeObject(a, new FJson()); without [JsonConverter(typeof(FJson))] annotation workd fine

            // json = JsonConvert.SerializeObject(a); StackOverflowException


            Console.WriteLine(json);

            Console.ReadLine();

        }

    }


    //[JsonConverter(typeof(FJson))] StackOverflowException

    public class A

    {

        public A()

        {

            this.b = new B();

        }


        public int id { get; set; }

        public string name { get; set; }

        public B b { get; set; }

    }


    public class B

    {

        public string name { get; set; }

    }


    public class FJson : JsonConverter

    {

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)

        {

            JToken t = JToken.FromObject(value);

            if (t.Type != JTokenType.Object)

            {

                t.WriteTo(writer);

                return;

            }


            JObject o = (JObject)t;

            writer.WriteStartObject();

            WriteJson(writer, o);

            writer.WriteEndObject();

        }


        private void WriteJson(JsonWriter writer, JObject value)

        {

            foreach (var p in value.Properties())

            {

                if (p.Value is JObject)

                    WriteJson(writer, (JObject)p.Value);

                else

                    p.WriteTo(writer);

            }

        }


        public override object ReadJson(JsonReader reader, Type objectType,

           object existingValue, JsonSerializer serializer)

        {

            throw new NotImplementedException();

        }




慕运维8079593
浏览 720回答 3
3回答
打开App,查看更多内容
随时随地看视频慕课网APP