【问题标题】:How to deserialize a JSON stream to a JToken?如何将 JSON 流反序列化为 JToken?
【发布时间】:2021-06-08 09:17:10
【问题描述】:

我想将 JSON 流反序列化为 JToken 对象(可以是 JObject/JArray/JToken,但称为 JToken)。 我想将结果用作 JToken 对象,而不是像大多数示例所示的其他类实例。

如何做到这一点?

【问题讨论】:

    标签: c# json serialization json.net


    【解决方案1】:

    要将Stream 加载为JToken,您可以使用以下任一方法:

    首先创建以下一种或两种方法:

    public static partial class JsonExtensions
    {
        public static JToken LoadFromStream(Stream s, JsonLoadSettings settings = default, bool closeInput = true, FloatParseHandling? floatParseHandling = default, DateParseHandling? dateParseHandling = default)
        {
            using (var reader = new StreamReader(s))
            using (var jsonReader = new JsonTextReader(reader) { CloseInput = closeInput })
            {
                if (floatParseHandling != null)
                    jsonReader.FloatParseHandling = floatParseHandling.Value;
                if (dateParseHandling != null)
                    jsonReader.DateParseHandling = dateParseHandling.Value;
                // You might also need to configure DateTimeZoneHandling, DateFormatString and Culture to fully control loading of dates and times.
                return JToken.Load(jsonReader, settings);
            }
        }       
    
        public static T Deserialize<T>(Stream s, JsonSerializerSettings settings = default, bool closeInput = true)
        {
            // This method taken from this answer https://stackoverflow.com/a/22689976/3744182
            // By https://stackoverflow.com/users/740230/ygaradon
            // To https://stackoverflow.com/questions/8157636/can-json-net-serialize-deserialize-to-from-a-stream
            // And modified to pass in settings and control whether the input stream is closed
            using (var reader = new StreamReader(s))
            using (var jsonReader = new JsonTextReader(reader) { CloseInput = closeInput })
            {
                JsonSerializer ser = JsonSerializer.CreateDefault(settings);
                return ser.Deserialize<T>(jsonReader);
            }
        }
    }
    

    鉴于这些方法,您可以执行以下任一操作:

    var token = JsonExtensions.LoadFromStream(stream, new JsonLoadSettings {  /* Add your preferred load settings here */});
    

    或者

    var token = JsonExtensions.Deserialize<JToken>(stream, new JsonSerializerSettings { /* Add your preferred serializer settings here */ });
    

    注意事项:

    演示小提琴here.

    【讨论】:

      猜你喜欢
      • 2021-03-30
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多