如何表示JSON中的组合数据?

How to represent combination data in JSON?

我正在实施一个 API return 有多少用户在使用特定应用程序。

例如,假设我想要 return 表示

的数据

10 人仅使用 App1,8 人仅使用 App2,8 人仅使用 App3,15 人同时使用 App1 和 App2,20 人同时使用 App1、App2 和 App3。

我们如何设计JSON中的响应结构?

我认为return以逗号分隔格式

{
  "App1": 10,
  "App2": 8,
  "App3": 8,
  "App1,App2": 15,
  "App1,App2,App3": 20
}

这种格式是否正确且语义正确?

我也想到了Array,

[
   {"key": ["App1"], "count": 10},
   {"key": ["App2"], "count": 8},
   {"key": ["App3"], "count": 8},
   {"key": ["App1", "App2"], "count": 15},
   {"key": ["App1", "App2", "App3"], "count": 20}
]

但对它在语义上是否正确表示怀疑。

有没有更好的方法?表示此数据的最佳方式是什么?

我认为您尝试的解决方案非常有限。您的解决方案适用于 3 个应用程序,但假设您稍后想要添加更多应用程序,那么您也添加了那些 return 类型。

我想建议如下,而不是上面的。此建议耦合度低,适用于任意数量的应用程序

{
  "IndividualAppUsersCount":[10,8,8],
  "MultipleAppUsersCount":[ 
    {
      "AppsInUse":"App1+App2",
      "Count":15
    },
    {
      "AppsInUse":"App1+App2+App3",
      "Count":20
    }
  ]
}

使用这种方法的好处是您不局限于预定义的应用程序,而是可以轻松处理 0 到 n 个应用程序。直接遍历数组,得到对应的结果即可。

您甚至可以通过以下方式改进上述结果。

{

  "AppUsersCount":[
    {
      "AppsInUse":"App1",
      "Count":10
    },
    {
      "AppsInUse":"App2",
      "Count":8
    },
    {
      "AppsInUse":"App3",
      "Count":8
    },
    {
      "AppsInUse":"App1, App2",
      "Count":15
    },
    {
      "AppsInUse":"App1, App2, App3",
      "Count":20
    }
  ]
}

我希望这能回答您的问题。但是,如果您还有任何其他问题,请告诉我,我很乐意回答。

感谢阅读。

我会采用以下结构:

{
  "usersCount": [
    {
      "apps": ["App1"],
      "userCount": 10
    },
    {
      "apps": ["App2"],
      "userCount": 8
    },
    {
      "apps": ["App3"],
      "userCount": 8
    },
    {
      "apps": ["App1", "App2"],
      "userCount": 15
    },
    {
      "apps": ["App1", "App2", "App3"],
      "userCount": 20
    }
  ]
}

这将使解析和处理多个应用程序变得更加容易(例如与字符串拆分相比)。为了使它的类型更强一点,我将 App1App2App3 值设为 App 枚举。

将这个问题想象成维恩图中三个重叠的人口。表示维恩图的最佳方法是将每个部分表示为一个 有序列表 成分和与之相关的数字。这将唯一代表每个部分以构成一个整体。

现在这两个方案都达到了这个目的。但是作为 JSON 键的 CSV 有几个缺陷:

  1. Typescript 定义会很困难。在第一种情况下,您的 Typescript 定义将是一个 Record<string, number> ,它不像第二种情况那样强类型化(阅读较少的特异性),即

    type App = 'App1' | 'App2' | 'App3';
    type AppUsage = Array<{ key: Array<App>, count: number }>;
    
  2. 第一种是脆的。如果应用程序名称有逗号怎么办?您的客户必须知道格式。他们将如何区分 "App1,App2""App1, App2"(请注意逗号后的 space?)。通常建议不要使用格式相关标识符。数组更易于使用并提供更好的一致性。

  3. 如果您使用 GraphQL,使用普通 JSON,这是第一种方法,通常被认为是一种不好的做法。

所以,归根结底,这应该是更好的方法,


type App = 'App1' | 'App2' | 'App3';
type AppUsage = Array<{ key: Array<App>, count: number }>;

const appUsage: AppUsage = [
   {"key": ["App1"], "count": 10},
   {"key": ["App2"], "count": 8},
   {"key": ["App3"], "count": 8},
   {"key": ["App1", "App2"], "count": 15},
   {"key": ["App1", "App2", "App3"], "count": 20}
]