【问题标题】:Parse nested json to TMap in Unreal Engine 4在虚幻引擎 4 中将嵌套的 json 解析为 TMap
【发布时间】:2021-02-17 00:12:17
【问题描述】:

我在 UE4 中有一个具有以下结构的嵌套 json:

{
    "boundary_points__per__cell": {
        "0": [{
                "x": 16.451330042628662,
                "y": 2.0813326861577965
            },
            {
                "x": 16.755262971791506,
                "y": 2.0406535171257136
            }
        ],
        "1": [{
                "x": -1.6378002918100634,
                "y": 4.9689057223409412
            },
            {
                "x": 0.9452331911724825,
                "y": 6.1469903490163311
            }
        ]
    }
}

我尝试使用建议使用JsonObjectStringToUStruct 的其他线程提出的技术。特别是我有以下结构来解析 json 逻辑:

USTRUCT()
struct FBoundaryPoint
{
    GENERATED_USTRUCT_BODY()

    UPROPERTY()
    int32 x;
    UPROPERTY()
    int32 y;
    
};

USTRUCT()
struct FBoundaryPoints
{
    GENERATED_USTRUCT_BODY()

    UPROPERTY()
    TArray<FBoundaryPoint> BoundaryPoints;
    
};

USTRUCT()
struct FVoronoiStruct
{
    GENERATED_USTRUCT_BODY()

    UPROPERTY()
    TMap<FString, FBoundaryPoints> boundary_points__per__cell;
};

但是,虽然我可以接收键字符串(例如“0”、“1”),但我无法提取 json 数组的值。为了这个问题,边界点字典仅包含 2 个键(“0”、“1”)。在真实场景中,它所包含的内容比所呈现的案例要多得多。

任何帮助将不胜感激。

【问题讨论】:

  • 您找到解决方案了吗?如果我的回答有帮助,请考虑accepting it
  • 您好,为了解决这个问题,我使用了蛮力方法,从根目录开始并通过 json 进行搜索,但是对于那些需要更自动化和更强大的解决方案的人来说,您的回答似乎是一个好的开始。所以我接受了。

标签: c++ json unreal-engine4


【解决方案1】:

首先,这些不是整数,因此您可能希望使用floatdouble 而不是int32

关于为什么它不会解析的话题,基于a comment by nick.shin

TMap 的使用不适用于 JSON——必须使用更简单的 TArray。

并且,为了给你最接近的“TMap-like”功能——你的 JSON 需要看起来像:

 {
   "boundary_points__per__cell": [
     { "key":"0", "value":[{ "x":16.451330042628662, "y":2.0813326861577965 }] },
     { "key":"1", "value":[{ "x":16.755262971791506, "y":2.0406535171257136 }] }
   ]
 }

当使用JsonObjectConverter 时——引擎将不允许您“即时”组成“键”名称——您需要定义它,以便引擎可以使属性作为标准 C++ 结构访问(这使得设置和使用蓝图成为可能)。

话虽如此,您可以创建自己的键:值对——但是,您需要使用更底层的TJsonWriterTJsonWriterFactory & TJsonReaderTJsonReaderFactory 函数。当您填写可能正在使用 TMap 的自己的 USTRUCT 时,您需要握住引擎的手...

然后,您的自定义 JSON 解析器和写入器可以读取如下内容:

 {
   "MyMap": [
     { "MyKey1", { "0", "bliz" } },
     { "MyKey2", { "1", "blaz" } }
   ]
 }

【讨论】:

    猜你喜欢
    • 2015-08-01
    • 2015-01-13
    • 1970-01-01
    • 2020-07-24
    • 2015-02-04
    • 2019-12-09
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多