【问题标题】:Error while de-serializing json array [duplicate]反序列化json数组时出错[重复]
【发布时间】:2018-04-28 11:45:55
【问题描述】:

我正在尝试反序列化 Json 字符串。

这是我的代码:

[System.Serializable]
public class SharedWorlds
{
    public int worldId { get; set; }
    public System.DateTime uploaded { get; set; }
    public string username { get; set; }
    public string levelName { get; set; }
    public string gameVersion { get; set; }
    public string description { get; set; }
    public string filename { get; set; }
    public string screenshot1 { get; set; }
    public string screenshot2 { get; set; }
    public string userTag { get; set; }
    public string userURL { get; set; }
    public double price { get; set; }
    public int    nrDownload { get; set; }
    public int    votes { get; set; }
}
[System.Serializable]
public class Record {
    public List<SharedWorlds> record;
}

    try {
        SDE3D _webService = new SDE3D();
        result= _webService.GetMassiveWorldsList ();

        var records = JsonUtility.FromJson<Record>(result);
    }
    catch(System.Exception ex) {
        Debug.Log (ex.Message.ToString ());
    }

这是我的有效 json(这里有两条记录,但我想每次发送许多记录)。

[
  {
    "worldId": 5,
    "uploaded": "/Date(1524875719000)/",
    "username": "quik",
    "levelName": "Station",
    "gameVersion": "1.0.1",
    "description": "iwoeijksf",
    "filename": "0000003.dat",
    "screenshot1": "0000003a.png",
    "screenshot2": "0000003b.png",
    "userTag": "",
    "userURL": "",
    "price": 0,
    "nrDownload": 5,
    "votes": 5
  },
  {
    "worldId": 4,
    "uploaded": "/Date(1524875659000)/",
    "username": "aksio",
    "levelName": "Garage",
    "gameVersion": "1.0.1",
    "description": "Adlkld",
    "filename": "0000003.dat",
    "screenshot1": "0000003a.png",
    "screenshot2": "0000003b.png",
    "userTag": "",
    "userURL": "",
    "price": 0,
    "nrDownload": 4,
    "votes": 4
  }  
]

我收到错误:

“ArgumentException:JSON 必须表示一个对象类型。”

我很确定错误在此代码行中:

var records = JsonUtility.FromJson<Record>(result);

如何反序列化 json 对象数组?

谢谢

【问题讨论】:

  • 我猜 JSON 没有 record 字段,而您的 Record 类则没有。我认为,要使该行起作用,Record 必须是 List&lt;SharedWorlds&gt; 而不是包含一个。
  • 尝试使用JsonUtility.FromJson&lt;SharedWorlds[]&gt;(result);
  • 为什么那个类叫SharedWorlds,而不是SharedWorld?肯定每一个都只是一个世界吗?
  • 您的 json 与您尝试将其反序列化为的对象不匹配。还有其他问题,例如在该对象中使用属性:{ get; set; } 并尝试使用JsonUtility.FromJson 反序列化 json 数组。这不起作用(不支持)。我正要回答,但我之前已经回答了涵盖您的问题的所有内容,并认为最好将其标记为重复。首先,使用this 从 json 数组生成数据。删除 { get; set; } 然后使用 JsonHelper.FromJson 反序列化您的 json 数组。

标签: c# json web-services unity3d deserialization


【解决方案1】:

因为您的 JSON 数据不是 Record。这是SharedWorlds 的集合。所以是这样的:

var sharedWorlds = JsonUtility.FromJson<SharedWorld[]>(result);

或许:

var sharedWorlds = JsonUtility.FromJson<List<SharedWorld>>(result);

您可以从中创建Record

var record = new Record { record = sharedWorlds };

如果 JSON 需要反序列化为 Record,那么它需要采用 Record 对象的格式:

{
    "record": 
    [
        /* the rest of your JSON within the square brackets */
    ]
}

那么就是Record

var record = JsonUtility.FromJson<Record>(result);

*旁注:您的类和变量名称以及您使用的复数形式确实令人困惑。其语义可能不会让您的调试变得更容易。

【讨论】:

    【解决方案2】:

    您可以在 JSON 中获取对象的脚本集合,没有一个对象

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-11
      • 2017-05-10
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多