gpt4 book ai didi

c# - Newtonsoft JsonConverter 将字符串或对象转换为对象

转载 作者:行者123 更新时间:2023-12-04 09:15:17 27 4
gpt4 key购买 nike

我有一些反序列化的要求,我正在尝试处理我可能拥有这些潜在输入的地方:

{
"value": "a string"
}

-- 或--

{
"value": {
"text": "a string"
// there are other properties, but for successful deserialization I only need text present
}
}

我希望它能够成功转换为对象MyObject:

public class MyObject
{
[JsonProperty("text")
public string Text { get; set; }
}

到目前为止,这就是我的转换器中的内容。这种情况在它是一个字符串时工作正常(虽然不是很有效,因为我抛出异常来捕获失败的反序列化)。但是,当它是一个对象时,读取器会抛出异常,我不确定如何处理它。

public class MyObjectConverter : JsonConverter
{
public override bool CanWrite { get => false; }

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

public override bool CanConvert(Type objectType)
{
return objectType == typeof(string) || objectType == typeof(MyObject);
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var value = reader.Value?.ToString();
if (string.IsNullOrWhiteSpace(value))
{
return null;
}

try
{
return JObject.Parse(value).ToObject<MyObject>();
}
catch (Exception)
{
return new MyObject
{
Text = value
};
}
}
}

也许我已经有了一个我不知道的好方法?如果不是,我如何确定我的输入是字符串还是对象,以便能够返回我关心的对象?

解决方案:

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.String)
{
return new MyObject
{
Text = reader.Value?.ToString()
};
}
else if (reader.TokenType == JsonToken.StartObject)
{
JObject obj = JObject.Load(reader);
return obj.ToObject<MyObject>();
}
else
{
return null;
}
}

最佳答案

您的对象的结构与您期望的输入不同。对于第二种情况,MyObject 需要如下所示:

// this is ugly
public class MyObject
{
public Value value{get;set;}

public class Value{
public string text {get;set;}
}
}

如果你想像现在一样只拥有一个具有单个 Text 属性的对象,你可以这样做:

public override object ReadJson(JsonReader reader, Type objectType, object 
existingValue, JsonSerializer serializer)
{
JObject obj = JObject.Load(reader);
var value = obj["value"];

if(value is JObject) // this will be true if the value property is a nested structure
return new MyObject(){Text=value["text"]}; // could also do value.ToObject<MyObject>() if you need more properties
else
return new MyObject(){Text=value};
}

关于c# - Newtonsoft JsonConverter 将字符串或对象转换为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63252521/

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