C# 如何解析Unity中以特殊字符开头的嵌套JSON对象?

C# 如何解析Unity中以特殊字符开头的嵌套JSON对象?,c#,json,unity3d,C#,Json,Unity3d,我试图从MongoDB获取这些信息,它给了我这个JSON来处理: { \"values\": [ { \"_id\" : { \"$oid\" : \"5ccf1bc55d0e652b8a6c9153\"} , \"Id\" : 5 ,\"Name\" : \" palups\"} ,

我试图从MongoDB获取这些信息,它给了我这个JSON来处理:

{
    \"values\":
        [ 
            { \"_id\" : { \"$oid\" : \"5ccf1bc55d0e652b8a6c9153\"} , \"Id\" : 5 ,\"Name\" : \" palups\"} , 
            { \"_id\" : { \"$oid\" : \"5ccf24e91f6e4f29b5ede29b\"} , \"Id\" : 2 ,\"Name\" : \"Maria\"} , 
            { \"_id\" : { \"$oid\" : \"5ccf25071f6e4f29b5ede2c5\"} , \"Id\" : 3 ,\"Name\" : \"marcela\"}
        ]
}
问题是嵌套对象$oid。我设法得到了Id和名称,但没有得到嵌套对象

以下是我尝试过的:

[System.Serializable]
public class ScoreData {
    public List<Values> values = new List<Values>();
}

[System.Serializable]
public class Values
{
    public _id oid;
    public int Id;
    public string Name;
}

[System.Serializable]
public class _id
{
    public string m_oid;
}
[System.Serializable]
公共类分数数据{
公共列表值=新列表();
}
[系统可序列化]
公共阶级价值观
{
公共id oid;
公共int Id;
公共字符串名称;
}
[系统可序列化]
公共类id
{
公共字符串m_oid;
}
上面的部分是我创建的类,下面的代码是提供给我的函数,我添加了一些内容以使其按我想要的方式工作:

IEnumerator getProductsInDB(){
    UnityWebRequest unityWebRequest = UnityWebRequest.Get (baseURL+databaseName+"/collections/"+collectionName+"?apiKey=" + apiKey);
    yield return unityWebRequest.Send();

    if(unityWebRequest.isNetworkError || unityWebRequest.isHttpError) {
        Debug.Log(unityWebRequest.error);
    }
    else {
        //Debug.Log (unityWebRequest.downloadHandler.text);
        jsonString = unityWebRequest.downloadHandler.text;

        string JSONToParse = "{\"values\":" + jsonString + "}"; //estava faltando no json ???

        ScoreData loadedScoreData = JsonUtility.FromJson<ScoreData>(JSONToParse);

        for (int i = 0; i <= loadedScoreData.values.Count; i++)
        {
            Debug.Log("score: " + loadedScoreData.values[i].oid.m_oid);
            Debug.Log("score: " + loadedScoreData.values[i].Id);
            Debug.Log("name: " + loadedScoreData.values[i].Name);
            Debug.Log("****************************************");
        }
    }
}
IEnumerator getProductsInDB(){
UnityWebRequest UnityWebRequest=UnityWebRequest.Get(baseURL+databaseName+“/collections/”+collectionName+“?apiKey=“+apiKey);
收益率返回unityWebRequest.Send();
if(unityWebRequest.isNetworkError | | unityWebRequest.isHttpError){
Debug.Log(unityWebRequest.error);
}
否则{
//Log(unityWebRequest.downloadHandler.text);
jsonString=unityWebRequest.downloadHandler.text;
字符串JSONToParse=“{\“values\”:“+jsonString+”}”;//estava faltando没有json???
ScoreData loadedScoreData=JsonUtility.FromJson(JSONToParse);

对于(int i=0;i对于
JsonUtility
类中的字段名必须与JSON字符串中的字段名匹配。否则,“缺少”字段将只具有其默认值(在您的示例中为
“”

从JSON示例中的命名来看

  • 在类
    值中
    应该是

      public _id _id;
    
  • 在类
    \u id
    中,它必须是

      public string $oid;
    
但是,后者在c中无效#

  • 标识符必须以字母开头,或
  • 标识符可能包含Unicode字母字符、十进制数字字符、Unicode连接字符、Unicode组合字符或Unicode格式字符。有关Unicode类别的详细信息,请参阅Unicode类别数据库。您可以使用标识符上的@前缀声明与C#关键字匹配的标识符。The@不是标识符名称的一部分。例如,@if声明一个名为if的标识符。这些逐字标识符主要用于与以其他语言声明的标识符的互操作性
前缀
$
不符合这些规则

因此,如果您不能更改JSON,我担心
JsonUtility
在这种情况下对您没有帮助,您应该寻找另一个JSON解析器


例如,您可以使用,以便为每个
实例检索此特定字段,然后将其传入


无论如何 最简单的解决方案是,在解析该特殊字符之前,将其删除或替换为其他字符,例如

string JSONToParse = ("{\"values\":" + jsonString + "}").Replace('$', '_');
而是改变

[Serializeable]
public class _id
{
    public string _oid;
} 

正如鲁福爵士所说,你真的确定你必须这么做吗

string JSONToParse = ("{\"values\":" + jsonString + "}");

?在您的问题中,您是说您已经收到JSON,包括
{}
字段…

是否有任何理由将JsonToParse与值部分结合起来?对我来说,这只会增加noise@SirRufo我不知道,到目前为止OP用作输入的是什么,在我看来,其余的值基本上都被正确解析了,所以我从OP的例子中选取了它,但是的,可能是一个额外的错误源如果我删除这行代码,Unity将返回以下内容:ArgumentException:JSON必须表示对象类型。@derHugo非常感谢您的帮助。我在这里尝试过,但效果很好。我不知道为了实现JsonUtility,类中的字段名必须与myJSON字符串中的字段名相匹配(尽管我是这样做的),所以我不想换美元之类的东西。再次感谢你救了我的命haha@ViníciusPalu发布的“JSON”无效。转义字符位于有效JSON的错误位置