直接反序列化嵌入JSON中的JSON字符串。

我使用的是.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);

enter image description here

给TA打赏
共{{data.count}}人
人已打赏
解决方案

AppBox - 无法安装 "YourApp",请稍后再试。

2022-5-12 1:00:08

解决方案

如何选择带外键的项目?

2022-5-12 1:00:17

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索