直接反序列化嵌入在 JSON 中的 JSON 字符串 [英] Deserialize JSON string embedded within JSON directly
问题描述
我正在使用 .netcore 3.1 并且我正在使用 System.Text.Json
进行序列化和反序列化.我不知道如何准确地表达我的问题.我环顾四周,但找不到我的问题的直接答案.
如有重复,请见谅.
这是一个示例 JSON 响应.
<代码>{特性": {"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:空值}}",数量":2.4000000000,"meterId": "meterID1"}}
我对直接解析 instanceData
感兴趣.如果仔细观察,instanceData
是一个嵌入的 JSON 字符串.
<代码>{微软资源":{"resourceUri": "resourceUri1","location": "阿拉斯加",标签":空,附加信息":空}}
问题:
是否可以在解析整个 Json 的同时解析此 instanceData
?我们可以在 instanceData
字段中添加一些 Attributes 以进行直接解析吗?现在,我正在从解析的模型类访问字符串并分别解析 instanceData
.
这就是我现在正在做的事情(类似这样):
JsonSerializer.Deserialize
.
我已经为 instanceData
和其他实体构建了模型类.目前,instanceData
在我的根模型类中属于 string
类型.
我对直接解析 instanceData 感兴趣.如果仔细观察,instanceData 是一个嵌入的 JSON 字符串
是否可以在解析整个 Json 的同时解析此 instanceData?
您可以通过创建和使用
I'm using .netcore 3.1 and I'm using System.Text.Json
for serialization and deserialization. I didn't know how to phrase my question precisely. I looked around but couldn't find a direct answer for my question.
Apologies if it's a duplicate.
This is a sample JSON response.
{
"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"
}
}
I'm interested in directly parsing instanceData
.
If you observe closely, instanceData
is an embedded JSON string.
{
"Microsoft.Resources": {
"resourceUri": "resourceUri1",
"location": "Alaska",
"tags": null,
"additionalInfo": null
}
}
Question:
Is it possible to parse this instanceData
while the whole Json is being parsed? Can we add some Attributes to instanceData
field for direct parsing? Right now, I'm accessing the string from the parsed model class and parsing instanceData
separately.
This is what I'm doing right now (something like this):
JsonSerializer.Deserialize<MicrosoftResources>(parsedResponse.instanceData)
.
I have already built model classes for instanceData
and other entities. Currently, instanceData
is of type string
in my root model class.
I'm interested in directly parsing instanceData. If you observe closely, instanceData is an embedded JSON string
Is it possible to parse this instanceData while the whole Json is being parsed?
You can achieve above requirement by creating and using a custom converter, like below.
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;
}
Model Classes
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; }
}
Test code and result
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);
这篇关于直接反序列化嵌入在 JSON 中的 JSON 字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!