无法将动态对象转换为字符串集合

时间:2017-05-18 18:02:50

标签: c# asp.net json

我正在尝试将动态数据类型转换为字符串集合但是当到达第一个块的最后一行时,程序崩溃了,我根本找不到任何好方法来解决它。

var json = await response.Content.ReadAsStringAsync();
var result = JsonConvert.DeserializeObject<dynamic>(json);   
var firstInArray = result[0];

string UserId = firstInArray.userId.Value;
int OrderNumber = Convert.ToInt32(firstInArray.orderNumber.Value);

string[] CustomerId = firstInArray.customerId.Values;

数据:

[
{
    "userId": "H554S",
    "orderNumber": 0,
    "customerId": [
        "J800",
        "J801",
        "J802"
    ]

},
{
"userId": 
...
...
}   

2 个答案:

答案 0 :(得分:1)

我没有收到任何错误,请看一下这个小样本:

var obj = new []
{
    new {
        userId = "User1",
        orderNUmber = 0,
        customerId = new [] { "Foo", "Bar", "Woot" }
    },
    new {
        userId = "User2",
        orderNUmber = 0,
        customerId = new [] { "Foo", "Bar", "Woot" }
    },
};

var json = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
var result = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(json);

string UserId = result[0].userId.Value;

它适用于我。

  

鉴于您的错误,问题很可能是您的json格式不正确。

以上obj相当于此json:

[
  {
    "userId": "User1",
    "orderNUmber": 0,
    "customerId": [ "Foo", "Bar", "Woot" ]
  },
  {
    "userId": "User2",
    "orderNUmber": 0,
    "customerId": [ "Foo", "Bar", "Woot" ]
  }
]

替代方案(几乎在所有情况下都比使用dynamic更好)

不要使用dynamic类型,只需将其映射到模型即可。为此,请将其更改为:

var result = Newtonsoft.Json.JsonConvert.DeserializeObject<Bar>(json);

并制作这些类(示例)

public class Bar : List<Foo>
{
}

public class Foo
{
    public string UserId { get; set; }
    public int OrderNumber { get; set; }
    public List<string> CustomerId { get; set; }
}

答案 1 :(得分:0)

你应该真正采用Rufo和Svek爵士关于反序列化强类型类的建议。 Newtonsoft JSON对这类东西非常友好;您可以使用json2csharp.com从JSON示例生成类。

但是你可以通过检查调试器中的对象并找出你所拥有的确切内容来解决问题。猜测的时间浪费了,每次浪费100%。你可以在电视机前完成任务或吸毒。

var result = JsonConvert.DeserializeObject<dynamic>(json);

foreach (var r in result)
{
    Newtonsoft.Json.Linq.JArray ids = result[0].customerId;

    var idlist = ids.ToList();

    //  This throws an exception. Go figure.
    var idlist2 = result[0].customerId.ToList();
}