直接反序列化嵌入在 JSON 中的 JSON 字符串 [英] Deserialize JSON string embedded within JSON directly

查看:25
本文介绍了直接反序列化嵌入在 JSON 中的 JSON 字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 .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(parsedResponse.instanceData).

我已经为 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆