解析嵌套 json 到 Unreal Engine 中的 TMap 4
Parse nested json to TMap in Unreal Engine 4
我在 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”)。在真实场景中,它包含的内容将比呈现的案例多得多。
任何帮助将不胜感激。
首先,这些不是整数,因此您可能希望使用 float
或 double
而不是 int32
。
关于为什么不解析的话题,基于a comment by nick.shin:
TMap 的使用不适用于 JSON -- 必须使用更简单的 TArray。
并且,为了给您最接近的“类似 TMap”的功能——您的 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++ 结构(这使得设置和使用蓝图成为可能)。
话虽如此,您可以制作自己的 key:value 对——但是,您将需要使用更低级别的 TJsonWriter
和 TJsonWriterFactory
& TJsonReader
和 TJsonReaderFactory
函数。当您填写自己的可能正在使用 TMap 的 USTRUCT 时,您将需要握住引擎的手...
然后,您的自定义 JSON 解析器和编写器可以读取如下内容:
{
"MyMap": [
{ "MyKey1", { "0", "bliz" } },
{ "MyKey2", { "1", "blaz" } }
]
}
我在 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”)。在真实场景中,它包含的内容将比呈现的案例多得多。
任何帮助将不胜感激。
首先,这些不是整数,因此您可能希望使用 float
或 double
而不是 int32
。
关于为什么不解析的话题,基于a comment by nick.shin:
TMap 的使用不适用于 JSON -- 必须使用更简单的 TArray。
并且,为了给您最接近的“类似 TMap”的功能——您的 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++ 结构(这使得设置和使用蓝图成为可能)。
话虽如此,您可以制作自己的 key:value 对——但是,您将需要使用更低级别的 TJsonWriter
和 TJsonWriterFactory
& TJsonReader
和 TJsonReaderFactory
函数。当您填写自己的可能正在使用 TMap 的 USTRUCT 时,您将需要握住引擎的手...
然后,您的自定义 JSON 解析器和编写器可以读取如下内容:
{
"MyMap": [
{ "MyKey1", { "0", "bliz" } },
{ "MyKey2", { "1", "blaz" } }
]
}