使用 UnityEngine.JsonUtility 从 Unity3d 中的 InfluxDB REST 反序列化 JSON
Deserialize JSON from InfluxDB REST in Unity3d with UnityEngine.JsonUtility
我在使用 Unity3d 的 JsonUtility class 在 C# 中反序列化来自 influxDB 的 JSON 响应时遇到问题。
我使用 json2csharp.com 生成了我的 class。问题似乎是结果 JSON 字符串中有一个包含对象列表的列表。
这是来自 InfluxDB 的示例 JSON 结果:
{
"results": [
{
"statement_id": 0,
"series": [
{
"name": "cpu_load_short",
"columns": [
"time",
"value"
],
"values": [
[
"2015-01-29T21:55:43.702900257Z",
2
],
[
"2015-01-29T21:55:43.702900257Z",
0.55
],
[
"2015-06-11T20:46:02Z",
0.64
]
]
}
]
}
]
}
这是从 json2csharp 生成的class:
public class Series
{
public string name { get; set; }
public List<string> columns { get; set; }
public List<List<object>> values { get; set; }
}
public class Result
{
public int statement_id { get; set; }
public List<Series> series { get; set; }
}
public class RootObject
{
public List<Result> results { get; set; }
}
我只是不知道如何处理值字段中的 List<List<object>>
。
当 运行 程序获得此日志输出时(这不是示例 JSON 而是我的数据库的实际结果,但格式相同):
InfluxResult (
(List`1) results = List`1<Result> [
Result (
(Int32) statement_id = 0;
(List`1) series = List`1<Series> [
Series (
(String) name = "gf_hallway_temperature";
(List`1) columns = List`1<String> [
"time",
"value",
];
(List`1) values = Null;
),
];
),
];
)
如果我这样做,它会解析得更深一层:
[Serializable]
public class Series
{
public string name;// { get; set; }
public List<string> columns; // { get; set; }
public List<ValueSet> values; // { get; set; }
}
[Serializable]
public class ValueSet
{
public List<object> values;
}
但这显然只是将值解析为空对象列表。但是它们对应于 "valuesets".
列表的正确计数
我是业余爱好者级别的开发人员,所以我可能会错过这里的一些基本知识。我猜 json2csharp 生成器失败是因为嵌套列表?但是这个应该怎么处理,用UnityEngine.JsonUtility可以吗?此外,"valueset" 因数据库的设置方式而异,因此列列表代表值列表和连续行中每个字段的类型,如果我有任何意义,所以我想必须是某种通用对象,我会处理稍后产生的问题。
[
[
"2015-01-29T21:55:43.702900257Z",
2
],
[
"2015-01-29T21:55:43.702900257Z",
0.55
],
[
"2015-06-11T20:46:02Z",
0.64
]
]
不能被JSONUtility
反序列化。使用像 Newtonsoft JSON 这样的专用库来迭代 "Json Object"。
我在使用 Unity3d 的 JsonUtility class 在 C# 中反序列化来自 influxDB 的 JSON 响应时遇到问题。
我使用 json2csharp.com 生成了我的 class。问题似乎是结果 JSON 字符串中有一个包含对象列表的列表。
这是来自 InfluxDB 的示例 JSON 结果:
{
"results": [
{
"statement_id": 0,
"series": [
{
"name": "cpu_load_short",
"columns": [
"time",
"value"
],
"values": [
[
"2015-01-29T21:55:43.702900257Z",
2
],
[
"2015-01-29T21:55:43.702900257Z",
0.55
],
[
"2015-06-11T20:46:02Z",
0.64
]
]
}
]
}
]
}
这是从 json2csharp 生成的class:
public class Series
{
public string name { get; set; }
public List<string> columns { get; set; }
public List<List<object>> values { get; set; }
}
public class Result
{
public int statement_id { get; set; }
public List<Series> series { get; set; }
}
public class RootObject
{
public List<Result> results { get; set; }
}
我只是不知道如何处理值字段中的 List<List<object>>
。
当 运行 程序获得此日志输出时(这不是示例 JSON 而是我的数据库的实际结果,但格式相同):
InfluxResult (
(List`1) results = List`1<Result> [
Result (
(Int32) statement_id = 0;
(List`1) series = List`1<Series> [
Series (
(String) name = "gf_hallway_temperature";
(List`1) columns = List`1<String> [
"time",
"value",
];
(List`1) values = Null;
),
];
),
];
)
如果我这样做,它会解析得更深一层:
[Serializable]
public class Series
{
public string name;// { get; set; }
public List<string> columns; // { get; set; }
public List<ValueSet> values; // { get; set; }
}
[Serializable]
public class ValueSet
{
public List<object> values;
}
但这显然只是将值解析为空对象列表。但是它们对应于 "valuesets".
列表的正确计数我是业余爱好者级别的开发人员,所以我可能会错过这里的一些基本知识。我猜 json2csharp 生成器失败是因为嵌套列表?但是这个应该怎么处理,用UnityEngine.JsonUtility可以吗?此外,"valueset" 因数据库的设置方式而异,因此列列表代表值列表和连续行中每个字段的类型,如果我有任何意义,所以我想必须是某种通用对象,我会处理稍后产生的问题。
[
[
"2015-01-29T21:55:43.702900257Z",
2
],
[
"2015-01-29T21:55:43.702900257Z",
0.55
],
[
"2015-06-11T20:46:02Z",
0.64
]
]
不能被JSONUtility
反序列化。使用像 Newtonsoft JSON 这样的专用库来迭代 "Json Object"。