我想动态更改 json 属性名称并序列化对象。
这是我的两个不同实体的 json
对于客户
{
"userName": "66666",
"password": "test1234",
"customersList": [
{
"address": "Test Stree2",
"customerNumber": "US01-000281",
"city": ""
}
]
}
Run Code Online (Sandbox Code Playgroud)
联系方式
{
"userName": "66666",
"password": "test1234",
"contactList": [
{
"address": "Test stree1",
"contactNumber": "US01-000281",
"city": ""
}
]
}
Run Code Online (Sandbox Code Playgroud)
保存该数据的模型如下
public class URequest<T>
{
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string userName { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string password { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public IList<T> requestList { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
上面的代码中可能包含或 的requestList列表,但在发送时我想将json 属性名称更改为相应的实体名称,即因为它将是并且因为它将在序列化后。contactscustomerrequestListcustomercustomerListcontactcontactList
小智 6
您可以创建自定义 JsonConverter。
使用自定义 JsonConverter 来更改对象部分的序列化
例子
public class Customer
{
public string Name { get; set; }
}
public class Client
{
public string Name { get; set; }
}
public class URequest<T>
{
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string userName { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string password { get; set; }
[JsonIgnore]
public IList<T> requestList { get; set; }
}
public class URequestConverter<T> : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(URequest<T>));
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var objectType = value.GetType().GetGenericArguments()[0];
URequest<T> typedValue = (URequest<T>) value;
JObject containerObj = JObject.FromObject(value);
containerObj.Add($"{objectType.Name.ToLower()}List", JToken.FromObject(typedValue.requestList));
containerObj.WriteTo(writer);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
你可以这样使用它
[TestMethod]
public void TestMethod1()
{
URequest<Customer> request = new URequest<Customer>();
request.password = "test";
request.userName = "user";
request.requestList = new List<Customer>();
request.requestList.Add(new Customer() { Name = "customer" });
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Formatting = Formatting.Indented;
settings.Converters.Add(new URequestConverter<Customer>());
Console.WriteLine(JsonConvert.SerializeObject(request, settings));
}
Run Code Online (Sandbox Code Playgroud)