如何反序列化 json 数组?
Posted
技术标签:
【中文标题】如何反序列化 json 数组?【英文标题】:How can I deserialize json array? 【发布时间】:2021-09-10 16:38:39 【问题描述】:我有一个 json 和一个数组,看起来像这样:
"data" : [
[int],
[...],
[..n]
]
我可以使用 JsonUtility 从“数据”中获取数组吗?还是其他方式?
目前,我可以使用以下代码获取“数据”:
[System.Serializable]
public class ObjectProperties
public int[] data;
public string color;
public void LoadFromJson()
objectProperties = JsonUtility.FromJson<ObjectProperties>(File.ReadAllText(Application.streamingAssetsPath + "/CubeSettings.json"));
我可以得到任何数据,但我需要的数组除外。
【问题讨论】:
我不明白你想要什么。你能用你熟悉并使用的语言写它吗?谷歌翻译? 所以使用objectProperties.data。有什么问题? 那么有什么问题吗?否则我会说“就像这样”...... EXCEPT 你的结构真的是[[1], [2], [3], ... ]
.. 在这种情况下,你的JSON要么是错误的,而是应该是[1,2,3,...]
,或者你有嵌套数组( int[][]
) 内置的 JsonUtility
不支持 ...
@Sheradil,我更新了我的问题。请检查一下,如果你还有什么不明白的地方问我。
请明确您期望代码做什么以及您实际得到什么。从上面的代码我看不出有什么问题,你应该可以通过objectProperties.data
获取数组。
【参考方案1】:
如果结构实际上是例如
"data" : [
[1],
[2],
[3]
]
这是一个嵌套数组 int[][]
(每个元素都是数组本身的数组)。
所以 JSON 应该看起来像
"data" : [
1,
2,
3
]
或者 - 如果更改 JSON 不是你的选择 - 你的 c# 结构必须是
[System.Serializable]
public class ObjectProperties
public int[][] data;
public string color;
但是内置的JsonUtility
不支持这种嵌套数组(参见Script Serialization)。
为此,您需要使用不同的库,例如Newtonsoft .NET JSON
(以Package via the Package Manager 的形式提供)
var json = File.ReadAllText(Application.streamingAssetsPath + "/CubeSettings.json"));
var objectProperties = JsonConvert.DeserializeObject<ObjectProperties>(json);
这也意味着该字段在 Inspector 中将不可见/不可编辑,并且不会与 Unity 中的场景或预制件一起保存。
【讨论】:
非常感谢,这正是我所需要的 :)【参考方案2】:我假设“数据”是数组本身,而不是数组数组。 所以应该是
"data":[1,2,3],"color":"red"
您还应该定义 get/set 以将字段包含到序列化中:
[System.Serializable]
public class ObjectProperties
public int[] data get; set;
public string color get; set;
现在你可以运行它了:
var objectProperties = JsonSerializer.Deserialize<ObjectProperties>(...);
【讨论】:
您应该删除get; set
并坚持使用字段以保持 Unity 编辑器中的序列化 - 换句话说,以便能够保存场景和预制件中的值并能够通过检查器编辑值
我在示例中使用的 JsonSerializer 需要它。以上是关于如何反序列化 json 数组?的主要内容,如果未能解决你的问题,请参考以下文章