将字符串反序列化为JSON对象时出错

安德烈·穆苏(Andre Mousu​​)

我有一个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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用接口数据成员将JSON字符串反序列化为Java对象时出错

将JSON反序列化为对象时出错

将Mongodb字符串反序列化为对象

将JSON字符串反序列化为Class

当我将json字符串反序列化为c#对象时为空类

将Json Schema反序列化为Json字符串或对象

从json字符串反序列化为对象时,如何忽略null?

将Json字符串反序列化为对象Java

将json字符串反序列化为对象c#.net

将json字符串反序列化为python中的对象

将json字符串反序列化为python中的对象

将JSON对象属性反序列化为字符串

使用Jackson将JSON字符串或对象反序列化为String字段

将Json字符串反序列化为多种对象类型

如何将json字符串反序列化为对象

将json字符串反序列化为.NET对象列表

System.Text.Json-将嵌套对象反序列化为字符串

将一属性对象的JSON数组反序列化为字符串集合

将json twitter字符串反序列化为对象

使用Json.Net反序列化,将子对象反序列化为包含json的字符串/类似字符串?

将通用对象序列化/反序列化为字符串

将 JSON 反序列化为包含格式化为字符串的 Point 值的多态对象的 .NET 集合

将大对象序列化为 JSON 字符串

将JavaScript对象序列化为JSON字符串

将字符串转换为类型时出错-Newtonsoft JSON反序列化

将JSON字符串或字符串数组反序列化为Vec

使用对象映射器从 Json 字符串反序列化为对象时如何跳过映射映射

将JSON反序列化为C#对象以将嵌套数组显示为网格中的字符串

C# JSON 将文件反序列化为对象列表失败,将字符串转换为集合错误