#655 python里的bytes与UE里的FString数据交互   c++     json     python     rpc     snippets     UE4     字符串     3 months ago (owner) Document
// 以utf-8编码作为约定的交互标准

def Hello(self, endpoint: bytes):
        """
        用户上报自己的地址信息
        
        Args:
            endpoint (bytes): 地址信息. 格式为: {"client_type": "$client_type", "ip":"$ip", "port":$port}
        
        Returns:
            None
        """
        print('Hello:')
        endpoint_obj = json.loads(endpoint)

        with self._lock_endpoints:
            if endpoint_obj not in self._endpoints:
                print(endpoint)
                self._endpoints.append(endpoint_obj)


def GetMessage(self, msg_id: bytes) -> bytes:
        """
        根据消息ID获取消息内容。
        
        Args:
            msg_id (bytes): 消息ID,类型为bytes。
        
        Returns:
            bytes: 消息内容,类型为bytes。如果找不到对应的消息,则返回空bytes。
        """
        print('GetMessage:')
        msg_idS = msg_id.decode()
        if msg_idS in self._meta_msgpairs:
            return bytes(self._meta_msgpairs[msg_idS], 'utf-8')
        return bytes()


def GetAllMessages(self) -> bytes:
        """
        获取所有消息并返回字节类型。
        
        Args:
            无
        
        Returns:
            bytes: 包含所有消息的字节类型数据。
        
        """
        print('GetAllMessages:')
        return json.dumps(self._meta_msgpairs).encode('utf-8')


bool UApplyLutGameInstanceSubsystem::GetAllMessages( TMap<FString, FString>& Messages )
{
    if (p_client)
    {
	    auto result = p_client->call("GetAllMessages").as<std::string>();
        FString MappingJsonStr(result.size(), (const UTF8CHAR*)result.data()); // UTF8 bytes转FString
        // Parsing Json-formatted string
        TSharedRef<TJsonReader<>> JsonReader = TJsonReaderFactory<>::Create(MappingJsonStr);
		TSharedPtr<FJsonObject> RootJsonObj = MakeShareable(new FJsonObject);
		if (FJsonSerializer::Deserialize(JsonReader, RootJsonObj))
		{
            for(auto iter : RootJsonObj->Values)
            {
                Messages.Add(iter.Key, iter.Value->AsString());
            }
		}
        else
        {
	        UKismetSystemLibrary::PrintString(GetWorld(), TEXT("GetAllMessages::FJsonSerializer::Deserialize Failed!"));
            return false;
        }
        return !MappingJsonStr.IsEmpty();
    }
    return false;
}

bool UApplyLutGameInstanceSubsystem::GetMessage( const FString& MsgId, FString& MsgValue )
{
    if (p_client)
    {
	    auto result = p_client->call("GetMessage", FSTRING_TO_STD(MsgId)).as<std::string>();
        MsgValue = FString(result.size(), (const UTF8CHAR*)result.data());
        return !MsgValue.IsEmpty();
    }
    return false;
}