如何反序列化 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 数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何反序列化 json 数组?

如何使用 Jackson 反序列化来自 json 对象的对象数组

如何反序列化包含多维数组的json对象?

使用C# json 二维数组 反序列化

在反序列化时如何忽略JSON对象数组中的空白数组?

如何使用 Newtonsoft.Json 反序列化 JSON 数组