我有一个php文件,该文件读取.txt文件,并通过php服务器将其发送到ac#统一脚本。下面是显示前三行的文本文件的片段:
{ "lemma" : "aljotta", "gloss" : "Fisħ soup" }
{ "lemma" : "arguzin", "gloss" : "Slave driver" }
{ "lemma" : "armunjaka", "gloss" : "Armunjaka" }
这是PHP脚本:
<?php
$file = fopen("lemmas.txt", "r");
echo fread($file, filesize("lemmas.txt"));
fclose($file);
?>
在ac#脚本中,返回文本,并将每一行分成一个数组(string []行)插槽,如下所示:
IEnumerator GetTextFromFile()
{
bool succcessful = true;
WWWForm form = new WWWForm();
WWW www = new WWW("http://localhost:9000/tounity.php", form);
yield return www;
if(www.error != null)
{
succcessful = false;
}
else
{
succcessful = true;
}
if (succcessful)
{
populateWordList(www.text);
}
}
void populateWordList(string text)
{
string[] textArray = text.Split('\n');
wordsList = gameDatabase.GetWords(textArray);
}
然后将该数组传递给一个方法,该方法将每行反序列化为GameDatabase类的对象,如下图所示:
public string lemma { get; set; }
public string gloss { get; set; }
public GameDatabase(string lemma, string gloss)
{
this.lemma = lemma;
this.gloss = gloss;
}
public ArrayList GetWords(string[] lines)
{
foreach (string line in lines)
{
GameDatabase gd = JsonConvert.DeserializeObject<GameDatabase>(line);
lemmasAndGlossesList.Add(new GameDatabase(gd.lemma, gd.gloss));
}
foreach(GameDatabase line in lemmasAndGlossesList)
{
Debug.Log(line.lemma + "------" + line.gloss);
}
return lemmasAndGlossesList;
}
错误发生GameDatabase gd = JsonConvert.DeserializeObject<GameDatabase>(line);
并返回
JsonReaderException: Unexpected character encountered while parsing value: . Path '', line 0, position 0.
我进行了广泛的搜索,但是没有找到任何有效的方法。任何帮助将不胜感激。值得注意的是,不使用php将文本文件直接加载为unity时,不会发生此问题。
编辑
使用vs调试器时,这是要反序列化的行中的值:
但是,Visual Studio 2019的JSON可视化工具报告以下内容:
感谢Jonathon K的评论和您的回复,我们可以看到PHP脚本返回的数据以BOM表开头:前三个字节。这篇不错的文章介绍了如何正确处理此类数据。简而言之:使用aStreamReader
读取数据。
这个小程序演示了如何处理您的数据:
using System;
using Newtonsoft.Json;
using System.IO;
public class Program
{
public static void Main()
{
var bytes = new byte[] {
0xEF,0xBB,0xBF,0x7B,0x20,0x22,0x6C,0x65,0x6D,0x6D,0x61,0x22,
0x20,0x3A,0x20,0x22,0x61,0x72,0x67,0x75,0x7A,0x69,0x6E,0x22,
0x2C,0x20,0x22,0x67,0x6C,0x6F,0x73,0x73,0x22,0x20,0x3A,0x20,
0x22,0x53,0x6C,0x61,0x76,0x65,0x20,0x64,0x72,0x69,0x76,0x65,
0x72,0x22,0x20,0x7D};
string json;
using(var ms = new MemoryStream(bytes))
using(var sr = new StreamReader(ms))
{
json = sr.ReadToEnd();
Console.WriteLine(json);
}
// I'm using dynamic here. In your case you can use GameDatabase
dynamic obj = JsonConvert.DeserializeObject(json);
Console.WriteLine(obj.lemma);
}
}
输出:
{ "lemma" : "arguzin", "gloss" : "Slave driver" }
arguzin
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句