我有以下JSON:
{
"ruleName": "PhoneNumber",
"ruleSetInput": [
{
"PersonCode": "85782",
"PhoneTypeId": "1",
"PhoneClassId": "0",
"DiallingCode": "021",
"PhoneNumber": "9321662",
"Extension": "",
"Status": "",
"User": "2",
"DateCapturd": ""
}
]
}
JSON在ruleSetInput
节点中并不总是具有相同的字段。我需要将ruleSetInput
下的每个值映射到具有以下类的类:
public class Parameter
{
public string Name { get; set; }
public string Value { get; set; }
[JsonIgnore]
public int Type { get; set; }
}
例如,参数将是一个列表,并包含一个值:
名称:"PersonCode";,值:";85782";
如何动态创建此映射?我已经尝试过Newtonsoft.Json
,但只有当我正在反序列化的对象具有这种确切的结构时,映射才会起作用。
解决方案1:使用JsonConverterAttribute
您可以实现JsonConverter
逻辑:
-
从
JArray
迭代每个JObject
。 -
对
JObject
中的每个JProperty
(键值对(进行迭代。 -
并添加到
List<Parameter>
类型的数组中。
对于RuleSetInput
属性,应用JsonConverterAttribute
。
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;
using System.Linq;
public class ParameterConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(Parameter));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
List<Parameter> parameters = new ();
JArray jArray = JArray.Load(reader);
foreach (JObject jObj in jArray)
{
foreach (JProperty jProp in (JToken)jObj)
{
parameters.Add(new Parameter
{
Name = jProp.Name,
Value = jProp.Value.ToString()
});
}
}
return parameters;
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
public class Rule
{
public string RuleName { get; set; }
[JsonConverter(typeof(ParameterConverter))]
public List<Parameter> RuleSetInput { get; set; }
}
var rule = JsonConvert.DeserializeObject<Rule>(json);
演示JsonConverterAttribute
@.NET Fiddle
解决方案2:使用JsonConstructorAttribute
实现逻辑是相同的,您可以通过应用JsonConstructorAttribute
将逻辑移动到构造函数中。
public class Rule
{
[JsonConstructor]
public Rule(string ruleName, JArray ruleSetInput)
{
RuleName = ruleName;
List<Parameter> parameters = new ();
foreach (JObject jObj in ruleSetInput)
{
foreach (JProperty jProp in (JToken)jObj)
{
parameters.Add(new Parameter
{
Name = jProp.Name,
Value = jProp.Value.ToString()
});
}
}
RuleSetInput = parameters;
}
public string RuleName { get; set; }
public List<Parameter> RuleSetInput { get; set; }
}
演示JsonContructorAttribute
@.NET Fiddle
您可以将ruleSetInput
设为Dictionary<string, string>
,然后使用ruleSetInput.Select(kv => new Parameter { Name = kv.Key, value = kv.Value }
从键值对构建Parameter
实例