我使用的是.netcore 3.1,我使用的是 System.Text.Json
用于序列化和反序列化。我不知道该如何准确地表达我的问题。我找了一圈,但没有找到我问题的直接答案。
如果是重复的问题,请原谅。
这是一个JSON响应的样本。
{
"properties": {
"subscriptionId": "sub1",
"usageStartTime": "2015-03-03T00:00:00+00:00",
"usageEndTime": "2015-03-04T00:00:00+00:00",
"instanceData": "{\"Microsoft.Resources\":{\"resourceUri\":\"resourceUri1\",\"location\":\"Alaska\",\"tags\":null,\"additionalInfo\":null}}",
"quantity": 2.4000000000,
"meterId": "meterID1"
}
}
我感兴趣的是 直接解析 instanceData
.如果你仔细观察, instanceData
是一个嵌入式JSON字符串。
{
"Microsoft.Resources": {
"resourceUri": "resourceUri1",
"location": "Alaska",
"tags": null,
"additionalInfo": null
}
}
问题。
能否解析这个 instanceData
而整个Json正在被解析?我们是否可以添加一些 属性 到 instanceData
字段进行直接解析?现在,我正从解析的模型类中访问字符串,并解析出 instanceData
分别。
这是我现在正在做的事情(类似这样)。
JsonSerializer.Deserialize<MicrosoftResources>(parsedResponse.instanceData)
.
我已经为 instanceData
和其他实体。目前: instanceData
属于 string
在我的根模型类中,我使用.netcore 3.1,我使用System.Text.Json进行序列化和反序列化。
解决方案:
我感兴趣的是直接解析instanceData。如果你仔细观察,instanceData是一个内嵌的JSON字符串。
能否在解析整个Json的同时解析这个instanceData?
你可以通过创建和使用一个 转换器,像下面这样。
public class ResConverter : JsonConverter<InstanceData>
{
public override InstanceData Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
//you can implement it based on your actual requirement
//...
string jsonData = reader.GetString();
var instanceData = System.Text.Json.JsonSerializer.Deserialize<InstanceData>(jsonData);
return instanceData;
}
模型类
public class MyModel
{
public Properties Properties { get; set; }
}
public class Properties
{
public string SubscriptionId { get; set; }
public DateTimeOffset UsageStartTime { get; set; }
public DateTimeOffset UsageEndTime { get; set; }
[JsonConverter(typeof(ResConverter))]
public InstanceData InstanceData { get; set; }
public double Quantity { get; set; }
public string MeterId { get; set; }
}
public class InstanceData
{
[JsonPropertyName("Microsoft.Resources")]
public MicrosoftResources MicrosoftResources { get; set; }
}
public class MicrosoftResources
{
public string ResourceUri { get; set; }
public string Location { get; set; }
public object Tags { get; set; }
public object AdditionalInfo { get; set; }
}
测试代码和结果
var jsondata = "{\"Properties\":{\"SubscriptionId\":\"sub1\",\"UsageStartTime\":\"2015-03-03T00:00:00+00:00\",\"UsageEndTime\":\"2015-03-04T00:00:00+00:00\",\"InstanceData\":\"{\\u0022Microsoft.Resources\\u0022:{\\u0022ResourceUri\\u0022:\\u0022resourceUri1\\u0022,\\u0022Location\\u0022:\\u0022Alaska\\u0022,\\u0022Tags\\u0022:null,\\u0022AdditionalInfo\\u0022:null}}\",\"Quantity\":2.4,\"MeterId\":\"meterID1\"}}";
MyModel myModel = System.Text.Json.JsonSerializer.Deserialize<MyModel>(jsondata);