gpt4 book ai didi

c# - 如何将 JSON 数组或 JSON 对象转换为对象列表?

转载 作者:太空宇宙 更新时间:2023-11-03 12:30:52 25 4
gpt4 key购买 nike

我尝试通过使用一些已回答问题的代码来创建自定义 JSON 转换器。

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

return null;
}

public override bool CanConvert(Type objectType)
{
return true;
}

public override bool CanWrite
{
get { return false; }
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}

这是我的示例模型类。

  public class Foo
{
[JsonProperty("type")]
public string Type;
}

我使用下面的代码来执行。它会导致有关堆栈溢出的错误。

var converter = new SingleValueArrayConverter<Foo>();

var test1 = "[{ \"type\": \"test\" }]";
var result1 = JsonConvert.DeserializeObject<List<Foo>>(test1, converter);

var test2 = "{ \"type\": \"test\" }";
var result2 = JsonConvert.DeserializeObject<List<Foo>>(test2, converter);

enter image description here

最佳答案

将任何 JSON 转换为 .NET 对象的最简单方法是使用 JToken 对象的 "ToObject" 方法。

public class FooConverter : JsonConverter
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var token = JToken.Load(reader);

if (token.Type == JTokenType.Array)
{
return token.ToObject<List<Foo>>();
}

var item = token.ToObject<Foo>();

return new List<Foo> { item };
}

public override bool CanConvert(Type objectType)
{
return true;
}

public override bool CanWrite
{
get { return false; }
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}

附言。 JToken 对象是任何 JSON 数据的基类,因此我们可以将 JToken 对象转换为任何合适的类型。

JToken             - abstract base class     
JContainer - abstract base class of JTokens that can contain other JTokens
JArray - represents an JSON array (contains an ordered list of JTokens)
JObject - represents an JSON object (contains a collection of JProperties)
JProperty - represents a JSON property (a name/JToken pair inside a JObject)
JValue - represents a primitive JSON value (string, number, boolean, null)

关于c# - 如何将 JSON 数组或 JSON 对象转换为对象列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42856232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com