- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想将 JSON 中使用的键翻译成不同的语言。
我知道在设计接口(interface)、API 等时,从技术角度来看这似乎是无稽之谈。为什么不首先只使用英语?嗯,这个需求不是我写的 ;)
/// <summary>serialization language</summary>
public enum Language
{
/// <summary>English</summary>
EN,
/// <summary>German</summary>
DE
// some more ...
}
实现这一点的最简单方法可能是一个属性:
/// <summary>An Attribute to add different "translations"</summary>
public class TranslatedFieldName : Attribute
{
public string Name { get; }
public Language Lang{ get; }
// actually there might be a dictionary with lang-name pairs later on; but let's keep it simple
public TranslatedFieldName(string translatedName, Language lang)
{
this.Lang = lang;
this.Name = translatedName;
}
}
然后我将这个属性添加到我想要序列化的类中:
/// <summary>I want to serialize classes of this kind to json in different languages </summary>
public class TranslatableObject
{
[TranslatedFieldName("deutscher_schluessel", Language.DE)]
public string english_key;
}
并调用JsonConvert.SerializeObject(...)
public void SerializationMethod()
{
TranslatableObject to = new TranslatableObject()
{
english_key = "foo bar"
};
string englishJson = JsonConvert.SerializeObject(to); // == { "english_key": "foo bar" }
string germanJson = JsonConvert.SerializeObject(to, new MultiLangConverter(Language.DE); // == { "deutscher_schluessel": "foo bar" }
}
我不知道使用过的 MultiLangConverter
实际上应该是什么样子:
public class MultiLangConverter : JsonConverter
{
private readonly Language _lang,
public MultiLangConverter() : this(Language.EN) { }
public MultiLangConverter(Language lang)
{
_lang = lang;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException("Out of scope for now");
}
public override bool CanRead
{
get { return false; } // out of scope for now
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
// what goes here?
}
}
我尝试过的所有尝试似乎都过于复杂。我真的需要 JsonConverter 吗?还是 ContractResolver 更适合?
最佳答案
我认为您使用属性来表示翻译后的字段名称是正确的,但我认为您最终会希望使用自定义 ContractResolver
来处理翻译而不是 JsonConverter
,尤其是当您需要对多个模型类进行翻译时(似乎很有可能)。
这是解析器的样子:
public class MultiLangResolver : DefaultContractResolver
{
public Language Language { get; set; }
public MultiLangResolver(Language lang)
{
Language = lang;
}
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty prop = base.CreateProperty(member, memberSerialization);
// See if there is a [TranslatedFieldName] attribute applied to the property
// for the requested language
var att = prop.AttributeProvider.GetAttributes(true)
.OfType<TranslatedFieldNameAttribute>()
.FirstOrDefault(a => a.Lang == Language);
// if so, change the property name to the one from the attribute
if (att != null)
{
prop.PropertyName = att.Name;
}
return prop;
}
}
下面是如何使用解析器序列化:
public static string Serialize(object obj, Language lang)
{
var settings = new JsonSerializerSettings
{
ContractResolver = new MultiLangResolver(lang),
Formatting = Formatting.Indented
};
var json = JsonConvert.SerializeObject(obj, settings);
return json;
}
另一个注意事项:您需要使用 [AttributeUsage]
属性标记您的 TranslatedFieldNameAttribute
类,这表明它可以用于属性并且可以多次应用(针对您要支持的每种不同语言一次):
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = true)]
public class TranslatedFieldNameAttribute : Attribute
{
...
}
关于c# - 不同的 "translated"JsonProperty 名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58013457/
我有一个 pojo,大多数时候我不想将字段写入 Json,但对于特定的条件,我想将这个值写入 json。例如我的模型是; public class Person { @JsonProperty
虽然类 DataType 的序列化会忽略 dbOptions,但会打印 dataType 及其值。 请注意,我只需要在序列化期间而不是反序列化期间忽略这些属性。 @JsonTypeInfo(use =
这个问题已经有答案了: Jackson enum Serializing and DeSerializer (19 个回答) 已关闭 4 年前。 我有一个简单的枚举,它具有 OK 和 FAULT 属性
我想要生成以下 JSON 输出。 **JSON Output:** { "ingredients": { "main": ["flour", "water", "egg"], "o
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我有以下 POJO(在构造函数等内): public class GlobalData implements Serializable { //constructors getters and s
我有一个要发送的 JSON 示例: {"lat":41.562592,"long":-8.430022}' 我需要引用第二个属性,如下所示: @JsonProperty('long') private
在 Google App Engine NDB 中,有一个属性类型 JsonProperty,它采用 Python list 或字典并自动序列化它。 我的模型的结构取决于这个问题的答案,所以我想知道对
是否有详细说明 JsonProperty 命名约定的文档?就像我声明 @JsonProperty("id") 什么可以和不能放在括号内一样? 最佳答案 任何东西。 JSON 生成器本身会转义奇怪或错误
简而言之,我正在尝试为我编写的休息服务编写一个带有休息保证的集成测试。我的问题是,当服务器尝试反序列化 JSON 时,我收到错误,字段“元数据”未标记为可忽略。我必须处理这个字段,这也意味着(据我所知
是否可以动态设置或在调用时设置所需的@JsonProperty? 这背后的原因...我正在生成描述架构并定义的 json 文件 新项目的必填字段是什么 项目更新需要哪些字段。 因此,创建只需要 foo
@JsonProperty 名称中允许有空格吗?即 @JsonProperty("Jon Snow") private String jonSnow = "Lord"; // getter & set
@Data public class Tests { @JsonProperty("comment") private String notes; } 我知道如何使用@JsonProp
我正在开发一个使用 Jackson 注释的 Spring boot 应用程序。 我想从配置中读取 @JsonProperty 的值,而不是使用常量字符串。 JSON 输入示例 {"s":12} 代码
以下是从服务收到的 json 响应的摘录。 aggregations: { gender: { ...other data } } 服务每次都会返回相同的结构,但
当我使用 Spring RestTemplate 使用一个安静的网络服务时,我得到以下异常 com.fasterxml.jackson.databind.exc.UnrecognizedPropert
我正在尝试创建一个包含来自 Facebook 和 Twitter 的信息的数据类。 但是在我来自 Twitter 的 JSON 回复中我需要 id_str 并且从 FaceBook 我得到 id。 我
如何使用@JsonProperty() 在另一个 json 对象中获取一个 json 对象?我要获取的示例json是: "location" : { "needs_recoding" : fals
jackson 的 @JsonProperty 是否有类级注释?在不知道类中有哪些字段名称的情况下,我可以用注释对类进行注释,它会自动为我映射吗? 目前我必须用 JsonProperty 注释每个字段
我有两个返回此 Json 的端点: "type": { "nbrCurrentRemainingDays": 0, "desc": "put desc here !",
我是一名优秀的程序员,十分优秀!