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