繁体   English   中英

如何将 Json.NET 用于无模式 JSON?

[英]How to use Json.NET for schemaless JSON?

如何将 Json.NET 用于无模式 JSON? 示例:{"x":"y"} 和 {"x":["y"]}。 我事先不知道 x 是一个元素还是多个元素。 You have to create a model class in C# to use Json.NET, but C# is a stronly typed language, so you have to say "string x" or "List x", but I dont know in advance what x is.

看到这个: https://weblog.west-wind.com/posts/2012/aug/30/using-jsonnet-for-dynamic-json-parsing

您可以JArray通过您的数据手动 go 并检查它是否为数组。

[TestMethod]
public void JsonParseToStrongTypeTest()
{
    JArray albums = JArray.Parse(jsonString) as JArray;

    // pick out one album
    JObject jalbum = albums[0] as JObject;

    // Copy to a static Album instance
    Album album = jalbum.ToObject<Album>();

    Assert.IsNotNull(album);
    Assert.AreEqual(album.AlbumName,jalbum.Value<string>("AlbumName"));
    Assert.IsTrue(album.Songs.Count > 0);
}

哦,现在我明白了。 你可以写一个 Json 转换器。

Model:

using System;
using System.Collections.Generic;
using System.Globalization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
namespace QuickType
{

    public partial class TheModel
    {
        [JsonProperty("x")]
        [JsonConverter(typeof(SingleValueArrayConverter<string>))]
        public List<string> X { get; set; }
    }
}

转换器

using System;
using System.Collections.Generic;

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

using Regiocast.Dds.ApiClient.DdsApiModels;

namespace Regiocast.Dds.ApiClient.JsonConverterResolver
{
    internal class SingleValueArrayConverter<T> : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return true;
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            object retVal = new Object();
            if (reader.TokenType == JsonToken.StartObject)
            {
                T instance = (T)serializer.Deserialize(reader, typeof(T));
                retVal = new List<T>() { instance };
            }
            else if (reader.TokenType == JsonToken.StartArray)
            {
                retVal = serializer.Deserialize(reader, objectType);
            }
            return retVal;
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            List<T> listValues = (List<T>)value;

            if (listValues.Count == 1)
            {
                JToken token = JToken.FromObject(listValues[0], serializer);
                token.WriteTo(writer);
            } else
            {
                JToken token = JToken.FromObject(listValues, serializer);
                token.WriteTo(writer);
            }
        }
    }
}

用途:

var deserializedObj = 
    JsonConvert.DeserializeObject<TheModel>(File.ReadAllText(json-file-path.json));    

未经测试,但应该可以工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM