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

时间:2019-05-26 06:06:32

标签: c# json unity3d

我正在尝试从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;
}

上面的部分是我创建的类,下面的代码是提供给我的函数,并添加了一些内容以使其按我想要的方式工作:

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("****************************************");
        }
    }
}

这就是我在Unity控制台上看到的:

https://imgur.com/a/gQ2ZeZR

(如您所见,第一行为空)。

  

得分:

     

UnityEngine.Debug:Log(Object)

     

得分:999

     

UnityEngine.Debug:Log(Object)

     

名称:Marcela

     

UnityEngine.Debug:Log(Object)

那么,如何解析嵌套值或我在做什么错呢?

1 个答案:

答案 0 :(得分:1)

对于JsonUtility,类中的字段名称必须与JSON字符串中的字段名称匹配。否则,“缺失”字段将仅具有其默认值(在您的情况下为"")。

从JSON示例中的命名开始

  • 在类Values中,它应该是

    public _id _id;
    
  • 在班级_id中,必须必须是

    public string $oid;
    

但是后者在c#中不是有效的identifier name

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

前缀$不符合这些规则。

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


您可以例如使用SimpleJson以便随后为每个Values实例检索此特定字段并将其传递。


无论如何

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

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

宁可更改

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

正如Rufo爵士评论的那样,您真的确定必须这样做

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

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