use*_*332 5 c# serialization json json.net deserialization
我正在从API检索JSON。我正在使用newtonsoft(这是json.net吗?)将其反序列化为对象列表。有用。
不幸的是,我还需要将此作为JSON传递给其他人(只有我有权访问它们,它们才能直接调用API)。不幸的是,我说这是因为我需要输出与接收到的JSON不同的JSON(属性名称必须不同)。
例如,我有一个名为Person的类,具有一个名为Name的属性。我想获取“人物”,因此我向该API发出请求,以获取上述JSON,并获取“人物”列表。不幸的是,API并没有向我返回具有Name属性的人员,而是向我返回了pname。因此,要对此进行映射,我只需执行以下操作:
[JsonProperty("pname")]
Run Code Online (Sandbox Code Playgroud)
一切都很好-它将pname转换为name,而我的班级现在有了值!我有一个有名字的人的名单。
现在,我需要将此对象列表以“名称”的形式返回给其他人,但是当我将people类序列化回JSON时,当我真的想将其以“名称”形式写出时,它将JSON写为“ pname” 。我怀疑它正在拾取“ JsonProperty”。
有没有办法让它使用pname进行反序列化,而使用原始属性值进行序列化?
谢谢!
您可以创建一个自定义合同解析器,将属性名称设置回您在序列化之前在 C# 类中定义的名称。下面是一些示例代码;
class OriginalNameContractResolver : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
// Let the base class create all the JsonProperties
IList<JsonProperty> list = base.CreateProperties(type, memberSerialization);
// assign the C# property name
foreach (JsonProperty prop in list)
{
prop.PropertyName = prop.UnderlyingName;
}
return list;
}
}
Run Code Online (Sandbox Code Playgroud)
像这样使用它;
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Formatting = Formatting.Indented;
if (useLongNames)
{
settings.ContractResolver = new OriginalNameContractResolver();
}
string response = JsonConvert.SerializeObject(obj, settings);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4473 次 |
| 最近记录: |