将具有动态键值对的JSON反序列化为类



我有以下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逻辑:

  1. JArray迭代每个JObject

  2. JObject中的每个JProperty(键值对(进行迭代。

  3. 并添加到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实例

最新更新