未正确读取 JSON 文件

Posted

技术标签:

【中文标题】未正确读取 JSON 文件【英文标题】:JSON file not being read properly 【发布时间】:2021-10-08 19:01:47 【问题描述】:

我正在尝试读取 C# 中的 JSON 文件,我对它还很陌生。以下是相关 Json 的布局:


  "stickerBundles": [
    
      "id": "ludoBundle",
      "stickers": [
        
          "id": "compter",
          "title": "Compter",
          "code": "LUDO WS1001",
          "loadingScreenColor": "#",
          "assetBundles": [
            
              "name": "animations",
              "assets": [ "Assets/AnimationCompter/Prefabs/Scene_Compter.prefab" ],
              "buildPath": [ "ar_animations-android-etc2", "ar_animations-ios-new" ]

            ,
            
              "name": "androidStory",
              "assets": [
                "Assets/Textures/Sprites/Histoires/Compter/Default/story-compter-alpha.spriteatlas",
                "Assets/Textures/Sprites/Histoires/Compter/Default/story-compter-noalpha.spriteatlas"
              ],
              "buildPath": [ "histoires/compter-android-etc2" ]
            ,
            
              "name": "iosNewStory",
              "assets": [
                "Assets/Textures/Sprites/Histoires/Compter/Default/story-compter-alpha.spriteatlas",
                "Assets/Textures/Sprites/Histoires/Compter/Default/story-compter-noalpha.spriteatlas"
              ],
              "buildPath": [ "histoires/compter-ios-new" ]
            ,
            
              "name": "iosOldStory",
              "assets": [
                "Assets/Textures/Sprites/Histoires/Compter/iOS/old/story-compter-alpha.spriteatlas",
                "Assets/Textures/Sprites/Histoires/Compter/iOS/old/story-compter-noalpha.spriteatlas"
              ],
              "buildPath": [ "histoires/compter-ios-old" ]
            
          ],
          "downloads": [
            "ar_animations",
            "histoires/compter",
            "games/seekandfind"
          ]
        , (...)

我正在尝试这样阅读:

public static StickerBundlesList GetStickersConfig()
    
        string jsonString = File.ReadAllText(STICKER_CONFIG_FILENAME);
        return JsonUtility.FromJson<StickerBundlesList>(jsonString);
    

我得到的对象是这样的:


    "stickerBundles": [
        
            "id": "ludoBundle"
        , (...)

意味着我不能使用除stickerBundles.id 之外的任何东西。

我为 StickerBundlesList(它只包含一个 StickerBundle 数组)和 StickerBundle、Sticker 和 Bundle 的结构创建了一个类。 StickerBundlesList 和 StickerBundle 是可序列化的。它们的外观如下:

StickerBundlesList.cs:

public partial class StickerResources

    [System.Serializable]
    public class StickerBundlesList
    
        public StickerBundle[] stickerBundles;
    

StickerBundle.cs:

public partial class StickerResources

    [System.Serializable]
    public struct StickerBundle
    
        public string id;
        public Sticker[] stickers;
    

StickerResources.cs:

public partial class StickerResources : SceneSingleton<StickerResources>

    public TextAsset textJson;
    public const string STICKER_CONFIG_FILENAME = "Assets/Resources/StickerResources/StickerResources.json";
    public struct Sticker
    
        public string id;
        public string title;
        public string code;
        public string loadingScreenColor;
        public Bundle[] assetBundles;
    
    public struct Bundle
    
        public string name;
        public string[] assets;
        public string[] buildPath;
    

    public StickerBundlesList stickerBundleList = new StickerBundlesList();

    private void Awake()
    
        stickerBundleList = JsonUtility.FromJson<StickerBundlesList>(textJson.text);
    

    public static StickerBundlesList GetStickersConfig()
    
        string jsonString = File.ReadAllText(STICKER_CONFIG_FILENAME);
        return JsonUtility.FromJson<StickerBundlesList>(jsonString);
    

我很想以 C# 对象的形式访问我的所有 JSON。我在这里做错了什么?

【问题讨论】:

+1 到问题的必要/几乎需要的输入来回答问题:-) 在查看提供的详细信息后,Sticker 似乎不存在 System.Serializable]和Bundlestructs。我认为添加此序列化后应该可以工作。与问题无关,虽然我总是尽量避免在项目中使用单例,但它们导致的耦合比项目中的其他任何东西都多。 @nIcEcOw 哇,谢谢,成功了! 【参考方案1】:

我认为问题的一部分可能是您的类/结构嵌套?可能暂时取消嵌套,直到序列化正常工作,然后如果你想稍后重新组织,再试一次。

我认为您并未包含所有源代码,因此我不得不进行一些推断。例如,我能够在 LINQPad 中使用它:

void Main()

    var jsonString = @"

  ""stickerBundles"": [

    
        ""id"": ""ludoBundle"",
      ""stickers"": [

        
            ""id"": ""compter"",
          ""title"": ""Compter"",
          ""code"": ""LUDO WS1001"",
          ""loadingScreenColor"": ""#"",
          ""assetBundles"": [

            
                ""name"": ""animations"",
              ""assets"": [ ""Assets/AnimationCompter/Prefabs/Scene_Compter.prefab"" ],
              ""buildPath"": [ ""ar_animations-android-etc2"", ""ar_animations-ios-new"" ]

            ]
        ]
    ]

";
    //string jsonString = File.ReadAllText(STICKER_CONFIG_FILENAME);
    var result = JsonConvert.DeserializeObject<StickerBundlesList>(jsonString);
    
    result.Dump();


[System.Serializable]
public class StickerBundlesList

    public StickerBundle[] stickerBundles;


[System.Serializable]
public struct StickerBundle

    public string id;
    public Sticker[] stickers;


[System.Serializable]
public struct Sticker

    public string id;
    public string title;
    // etc

输出对象层次结构(StickerBundleList > StickerBundle > Sticker):

我使用 LINQPad 对此进行了测试,但您应该能够将其放入新的 C# 控制台应用程序或其他东西中进行测试。另外,我使用了 JSON.Net JSON 库。我猜我们的库中的差异不是是什么使这个工作,但如果你认为它可能是,检查你的库的设置。我正在使用 JSON.Net 的默认设置。

【讨论】:

以上是关于未正确读取 JSON 文件的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:无法读取从带有已定义模板的 JSON 文件中读取的未定义属性(读取“array_google”)

Dojo ItemFileWriteStore 未读取 JSON 服务器文件

如何在 Ionic 中正确读取 JSON 文件?

在 Swift 中从 json 文件中读取数据的正确方法是啥?

如何仅使用 JavaScript 正确读取 json 文件 [重复]

Apple JSON API 在 PHP 中未正确解码 [关闭]