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

查看:121
本文介绍了直接反序列化嵌入在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}},
数量:2.4000000000,
meterId: meterID1
}
}

我对直接解析 instanceData 。
如果仔细观察, instanceData 是嵌入式JSON字符串。

  {
Microsoft.Resources:{
resourceUri: resourceUri1,
location:阿拉斯加,
tags:null,
additionalInfo:空
}
}

问题:



是否可以在解析整个Json的同时解析此 instanceData ?我们可以在 instanceData 字段中添加一些 Attributes 进行直接解析吗?现在,我正在从解析的模型类访问字符串,并分别解析 instanceData



我现在正在做的事情(像这样):



JsonSerializer.Deserialize< MicrosoftResources>(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天全站免登陆