【发布时间】:2019-09-14 15:51:03
【问题描述】:
我有一个 php 文件,它读取 .txt 文件并通过 php 服务器将其发送到 c# unity 脚本。下面是显示前 3 行的文本文件的 sn-p:
{ "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);
?>
在 c# 脚本中,文本被返回,每一行被分隔成一个数组(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 可视化工具报告了这一点:
【问题讨论】:
-
你的 JSON 看起来不错(只要你逐行阅读。通常的换行符是:
\r\n。你只是在\n上拆分,留下剩余的\r。在你之前反序列化line调用:line = line.Trim('\r')。 -
@bassxzero 他单独处理每一行。每行都是一个有效的 JSON。
-
我试过 line.Trim('\r') 但这不起作用。我还尝试在无效的 JSON 中添加方括号,并在 jsonlint.com 中测试了我的 json,它返回了有效的 json。
-
正如我所说,尝试相同的文件而不通过 php 发送它并直接使用 c# 中的流进行读取。难道是我需要用我的 php 传递任何标题?
-
文件末尾是否有换行符,或者
www.Text中是否有任何额外的换行符?当您在 \n 上拆分时,您可能会得到一个空条目...尝试打印或在调试器中检查line的值,或者只查看与您拥有文件的行数相比的行长
标签: c# php json unity3d json.net