[英]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.