无法在.NET Core C# 中反序列化 API 响应 json

问题描述 投票:0回答:1

我有第 3 方 Web api,它返回 json 响应,其中包含转义字符和许多反斜杠,如下所示。

我的目标是阅读所有服务组及其相关服务。即使使用了

replace
,
regex
后我也无法使用。

{
  "name": "servicesGroups",
  "value": "[{\"id\":\"ServiceGroup1\",\"types\":[\"books\"],\"services\":[{\"id\":2,\"calendarId\":2,\"publicId\":\"1234567890\"},{\"id\":1,\"calendarId\":1,\"publicId\":\"0987654321\"}],\"names\":{\"en\":\"Service Group1\"}},{\"id\":\"ServiceGroup2\",\"types\":[\"books\"],\"services\":[{\"id\":2,\"calendarId\":2,\"publicId\":\"7575637576457457567\"},{\"id\":1,\"calendarId\":1,\"publicId\":\"2143658709\"}],\"names\":{\"en\":\"ServiceGroup2\"}}}]"
}


      RootObject root = JsonConvert.DeserializeObject<RootObject>(servicegroupsjson);
      List<ServicesGroup> servicesGroups = JsonConvert.DeserializeObject<List<ServicesGroup>>(root.value); - Compile time error

     public class Service
     {
         public int id { get; set; }
         public int calendarId { get; set; }
         public string publicId { get; set; }
     }

     public class Names
     {
         public string en { get; set; }
     }

     public class ServicesGroup
     {
         public string id { get; set; }
         public List<string> types { get; set; }
         public List<Service> services { get; set; }
         public Names names { get; set; }
     }

     public class RootObject
     {
         public string name { get; set; }
         public List<ServicesGroup> value { get; set; }
     }
c# json replace json.net json-deserialization
1个回答
0
投票

您需要创建一个 List 实例并将其分配给 value。然后你可以使用 Newtonsoft.Json 反序列化该对象。

请参考以下代码:

using System;
using System.Collections.Generic;
using Newtonsoft.Json;

public class Service
{
    public int Id { get; set; }
    public int CalendarId { get; set; }
    public string PublicId { get; set; }
}

public class ServiceGroup
{
    public string Id { get; set; }
    public List<string> Types { get; set; }
    public List<Service> Services { get; set; }
    public Names Names { get; set; }
}

public class Names
{
    [JsonProperty("en")]
    public string English { get; set; }
}

public class ApiResponse
{
    public string Name { get; set; }
    public string Value { get; set; }
    public List<ServiceGroup> ServicesGroups { get; set; } = new List<ServiceGroup> ();
}

class Program
{
    static void Main()
    {
        string jsonResponse = @"{
            ""name"": ""servicesGroups"",
            ""value"": ""[
                {\""id\"":\""ServiceGroup1\"",\""types\"":[\""books\""],\""services\"":[{\""id\"":2,\""calendarId\"":2,\""publicId\"":\""1234567890\""},{\""id\"":1,\""calendarId\"":1,\""publicId\"":\""0987654321\""}],\""names\"":{\""en\"":\""Service Group1\""}},
                {\""id\"":\""ServiceGroup2\"",\""types\"":[\""books\""],\""services\"":[{\""id\"":2,\""calendarId\"":2,\""publicId\"":\""7575637576457457567\""} ,{\""id\"":1,\""calendarId\"":1,\""publicId\"":\""2143658709\""}],\""names\"":{\""en\"":\""ServiceGroup2\""}}
            ]""
        }";

        ApiResponse apiResponse = JsonConvert.DeserializeObject<ApiResponse>(jsonResponse);

        Console.WriteLine($"Name: {apiResponse.Name}");
        Console.WriteLine($"Value: {apiResponse.Value}");

        foreach (var serviceGroup in apiResponse.ServicesGroups)
        {
            Console.WriteLine($"ServiceGroup ID: {serviceGroup.Id}, English Name: {serviceGroup.Names?.English}");
            foreach (var service in serviceGroup.Services)
            {
                Console.WriteLine($"  Service ID: {service.Id}, Calendar ID: {service.CalendarId}, Public ID: {service.PublicId}");
            }
        }
    }
}

工作.Netfiddle 这里

© www.soinside.com 2019 - 2024. All rights reserved.