gpt4 book ai didi

c# - 如何使用 Json.NET 以与对象相同的方式序列化 JObject?

转载 作者:太空狗 更新时间:2023-10-29 19:40:38 25 4
gpt4 key购买 nike

如何控制 JObject 到字符串的序列化?

我有一些返回 JObject 的 API,我通常会应用一些更改并保留或返回它们。我想避免保留空属性并应用一些额外的格式,但 JsonConvert 似乎完全忽略了我的设置。

这是问题的示例:

// startup.cs has the following
services.AddMvc().AddJsonOptions(o =>
{
o.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
});

public class SampleController : Controller
{
JsonSerializerSettings _settings = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore
};

[HttpPost]
[Route("object")]
public object PostObject([FromBody] SomeObject data)
{
return JsonConvert.SerializeObject(data, _settings);
}

[HttpPost]
[Route("jobject")]
public object PostJObject([FromBody] JObject data)
{
return JsonConvert.SerializeObject(data, _settings);
}

public class SomeObject
{
public string Foo { get; set; }
public string Bar { get; set; }
}
}

发布 { "Foo": "Foo", "Bar": null }:

  • /object 返回 {"Foo":"Foo"}
  • /jobject 返回 {"Foo":"Foo","Bar":null}

我希望 JObject 方法返回与我使用对象相同的输出 json。如何在不创建助手的情况下实现这一目标?有没有办法使用相同的设置序列化 JObject?

最佳答案

与 NewtonSoft 框架良好集成的解决方案是提供一个遵循 NamingStrategy 的自定义 JObject 转换器。

JObject 自定义转换器

public class JObjectNamingStrategyConverter : JsonConverter<JObject> {

private NamingStrategy NamingStrategy { get; }

public JObjectNamingStrategyConverter (NamingStrategy strategy) {
if (strategy == null) {
throw new ArgumentNullException (nameof (strategy));
}
NamingStrategy = strategy;
}

public override void WriteJson (JsonWriter writer, JObject value, JsonSerializer serializer) {
writer.WriteStartObject ();
foreach (JProperty property in value.Properties ()) {
var name = NamingStrategy.GetPropertyName (property.Name, false);
writer.WritePropertyName (name);
serializer.Serialize (writer, property.Value);
}
writer.WriteEndObject ();
}

public override JObject ReadJson (JsonReader reader, Type objectType, JObject existingValue, bool hasExistingValue, JsonSerializer serializer) {
throw new NotImplementedException ();
}
}

用法

var snakeNameStrategy = new SnakeCaseNamingStrategy ();
var jsonSnakeSettings = new JsonSerializerSettings {
Formatting = Formatting.Indented,
Converters = new [] { new JObjectNamingStrategyConverter (snakeNameStrategy) },
ContractResolver = new DefaultContractResolver {
NamingStrategy = snakeNameStrategy
},
};

var json = JsonConvert.SerializeObject (obj, jsonSnakeSettings);

您可以在 GitHub 上找到有效的 PoC .

关于c# - 如何使用 Json.NET 以与对象相同的方式序列化 JObject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40244395/

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