反序列化物理上与领域模型不兼容 JSON
Deserialize physically incompatible JSON with domain model
我正在使用 Restsharp 休息 api。 api 的响应具有此结构。
{
"resourceId": "0014b07-92sl-si90",
"property": [
{
"name": "prop1",
"value": "-1.0"
},
{
"name": "prop2",
"value": "0.0"
},
{
"name": "prop3",
"value": "1000.0"
},
{
"name": "prop4",
"value": "Microsoft Windows"
},
{
"name": "prop5",
"value": "42917.0"
}]
}
我想将此响应反序列化到此域模型。
public class DomainModel
{
public double Prop1 {get; set;}
public double Prop2 {get; set;}
public double Prop3 {get; set;}
public string Prop4 {get; set;}
}
如您所见,我只需要 JSON 响应属性的一个子集,响应不能直接反序列化为域对象。
请问我该如何解决这个问题。
谢谢。
我会使用 Json.NET 并使用 JsonProperty 属性,如本答案中所述:
.NET NewtonSoft JSON deserialize map to a different property name
您可以反序列化对此 class 的响应:
public class MyResponse
{
public string resourceId {get;set;}
public List<MyProperty> property {get;set;}
}
public class MyProperty
{
public string name {get;set;}
public string value {get;set;}
}
然后将 MyResponse 转换为 DomainModel:
DomainModel myDomainModel = new DomainModel();
myDomainModel.Prop1 = myResponse.property.Where(c=>c.name =="prop1").SingleOrDefault()?.value;
myDomainModel.Prop2 = myResponse.property.Where(c=>c.name =="prop3").SingleOrDefault()?.value;
myDomainModel.Prop2 = myResponse.property.Where(c=>c.name =="prop3").SingleOrDefault()?.value;
myDomainModel.Prop4 = myResponse.property.Where(c=>c.name =="prop4").SingleOrDefault()?.value;
或者将您的逻辑构建到 custom deserializer。
public class DomainModel
{
public string Prop1 { get; set; }
public string Prop2 { get; set; }
public string Prop3 { get; set; }
public string Prop4 { get; set; }
}
class Program
{
static void Main(string[] args)
{
string json = @"{
""resourceId"": ""0014b07 - 92sl - si90"",
""property"": [
{
""name"": ""prop1"",
""value"": ""-1.0""
},
{
""name"": ""prop2"",
""value"": ""0.0""
},
{
""name"": ""prop3"",
""value"": ""1000.0""
},
{
""name"": ""prop4"",
""value"": ""Microsoft Windows""
},
{
""name"": ""prop5"",
""value"": ""42917.0""
}]
}";
var parsedJason = JObject.Parse(json);
DomainModel result = new DomainModel();
var jsonValues = parsedJason["property"].Select(x => ((JObject)x)).ToList();
var props = typeof(DomainModel).GetProperties();
jsonValues.ForEach(x =>
{
var jsonPropName = x.GetValue("name").ToString();
var jsonPropValue = x.GetValue("value").ToString();
var prop = props.Where(p => p.Name.ToUpper() == jsonPropName.Trim().ToUpper()).FirstOrDefault();
if (prop != null)
prop.SetValue(result, jsonPropValue, null);
});
}
}
我正在使用 Restsharp 休息 api。 api 的响应具有此结构。
{
"resourceId": "0014b07-92sl-si90",
"property": [
{
"name": "prop1",
"value": "-1.0"
},
{
"name": "prop2",
"value": "0.0"
},
{
"name": "prop3",
"value": "1000.0"
},
{
"name": "prop4",
"value": "Microsoft Windows"
},
{
"name": "prop5",
"value": "42917.0"
}]
}
我想将此响应反序列化到此域模型。
public class DomainModel
{
public double Prop1 {get; set;}
public double Prop2 {get; set;}
public double Prop3 {get; set;}
public string Prop4 {get; set;}
}
如您所见,我只需要 JSON 响应属性的一个子集,响应不能直接反序列化为域对象。
请问我该如何解决这个问题。
谢谢。
我会使用 Json.NET 并使用 JsonProperty 属性,如本答案中所述: .NET NewtonSoft JSON deserialize map to a different property name
您可以反序列化对此 class 的响应:
public class MyResponse
{
public string resourceId {get;set;}
public List<MyProperty> property {get;set;}
}
public class MyProperty
{
public string name {get;set;}
public string value {get;set;}
}
然后将 MyResponse 转换为 DomainModel:
DomainModel myDomainModel = new DomainModel();
myDomainModel.Prop1 = myResponse.property.Where(c=>c.name =="prop1").SingleOrDefault()?.value;
myDomainModel.Prop2 = myResponse.property.Where(c=>c.name =="prop3").SingleOrDefault()?.value;
myDomainModel.Prop2 = myResponse.property.Where(c=>c.name =="prop3").SingleOrDefault()?.value;
myDomainModel.Prop4 = myResponse.property.Where(c=>c.name =="prop4").SingleOrDefault()?.value;
或者将您的逻辑构建到 custom deserializer。
public class DomainModel
{
public string Prop1 { get; set; }
public string Prop2 { get; set; }
public string Prop3 { get; set; }
public string Prop4 { get; set; }
}
class Program
{
static void Main(string[] args)
{
string json = @"{
""resourceId"": ""0014b07 - 92sl - si90"",
""property"": [
{
""name"": ""prop1"",
""value"": ""-1.0""
},
{
""name"": ""prop2"",
""value"": ""0.0""
},
{
""name"": ""prop3"",
""value"": ""1000.0""
},
{
""name"": ""prop4"",
""value"": ""Microsoft Windows""
},
{
""name"": ""prop5"",
""value"": ""42917.0""
}]
}";
var parsedJason = JObject.Parse(json);
DomainModel result = new DomainModel();
var jsonValues = parsedJason["property"].Select(x => ((JObject)x)).ToList();
var props = typeof(DomainModel).GetProperties();
jsonValues.ForEach(x =>
{
var jsonPropName = x.GetValue("name").ToString();
var jsonPropValue = x.GetValue("value").ToString();
var prop = props.Where(p => p.Name.ToUpper() == jsonPropName.Trim().ToUpper()).FirstOrDefault();
if (prop != null)
prop.SetValue(result, jsonPropValue, null);
});
}
}