C# 将混合值Json列表传递给MVC操作

C# 将混合值Json列表传递给MVC操作,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我有一个Json: { 'TypeName': 'MyType', 'Values': { value1: 12, value2: 'asdf', value3: 32.2 } } 值可以是字符串或数字,并且未设置值的数量(因此可以是3,也可以是5或12)。我在MVC中有一个方法: class CoolObject{ public string TypeName { get; set; } publ

我有一个Json:

{
    'TypeName': 'MyType',
    'Values':
    {
        value1: 12,
        value2: 'asdf',
        value3: 32.2
    }
}
值可以是字符串或数字,并且未设置值的数量(因此可以是3,也可以是5或12)。我在MVC中有一个方法:

class CoolObject{
    public string TypeName { get; set; }
    public ?????? Values { get; set; }
}

[HttpPost]
public ActionResult DoStuff(CoolObject values){
    //Do cool stuff with cool object
}

CoolObject应该包含什么类型的对象才能工作???

您的JSON不是有效的JSON,它应该更像这样:

{
    "TypeName": "MyType",
    "Values": {
        "value1": 12,
        "value2": "asdf",
        "value3": 32.2
    }
}
int intValue;
if (int.TryParse(co.Values.value1.ToString(), out intValue))
{
  // it was int and you now have its value in intValue
}
else 
{
  // it was string
}
class CoolObject
{
  public string TypeName { get; set; }
  public Dictionary<string, object> Values { get; set; }
}
  CoolObject co = JsonConvert.DeserializeObject<CoolObject>(jsonData);
  foreach (KeyValuePair<string, object> kvp in co.Values)
    Console.WriteLine("{0} = {1}", kvp.Key, kvp.Value);
或者你可以在那里使用数组。但我们假设它是这样的。然后,您可以尝试使用以下类:

class CoolObjectValues
{
  public object value1 { get; set; }
  public object value2 { get; set; }
  public object value3 { get; set; }
}

class CoolObject
{
  public string TypeName { get; set; }
  public CoolObjectValues Values { get; set; }
}
请注意,当您想要处理CoolObjectValues中的值时,您需要确定值的类型。为此,您可以这样做:

{
    "TypeName": "MyType",
    "Values": {
        "value1": 12,
        "value2": "asdf",
        "value3": 32.2
    }
}
int intValue;
if (int.TryParse(co.Values.value1.ToString(), out intValue))
{
  // it was int and you now have its value in intValue
}
else 
{
  // it was string
}
class CoolObject
{
  public string TypeName { get; set; }
  public Dictionary<string, object> Values { get; set; }
}
  CoolObject co = JsonConvert.DeserializeObject<CoolObject>(jsonData);
  foreach (KeyValuePair<string, object> kvp in co.Values)
    Console.WriteLine("{0} = {1}", kvp.Key, kvp.Value);
更新:

对于数量不确定的值:

{
    "TypeName": "MyType", 
    "Values": {
        "value1": 12,
        "value2": "asdf",
        "value3": 32.2,
        ...
    }
}
您的类将如下所示:

{
    "TypeName": "MyType",
    "Values": {
        "value1": 12,
        "value2": "asdf",
        "value3": 32.2
    }
}
int intValue;
if (int.TryParse(co.Values.value1.ToString(), out intValue))
{
  // it was int and you now have its value in intValue
}
else 
{
  // it was string
}
class CoolObject
{
  public string TypeName { get; set; }
  public Dictionary<string, object> Values { get; set; }
}
  CoolObject co = JsonConvert.DeserializeObject<CoolObject>(jsonData);
  foreach (KeyValuePair<string, object> kvp in co.Values)
    Console.WriteLine("{0} = {1}", kvp.Key, kvp.Value);
类对象
{
公共字符串类型名{get;set;}
公共字典值{get;set;}
}
您可以这样使用它:

{
    "TypeName": "MyType",
    "Values": {
        "value1": 12,
        "value2": "asdf",
        "value3": 32.2
    }
}
int intValue;
if (int.TryParse(co.Values.value1.ToString(), out intValue))
{
  // it was int and you now have its value in intValue
}
else 
{
  // it was string
}
class CoolObject
{
  public string TypeName { get; set; }
  public Dictionary<string, object> Values { get; set; }
}
  CoolObject co = JsonConvert.DeserializeObject<CoolObject>(jsonData);
  foreach (KeyValuePair<string, object> kvp in co.Values)
    Console.WriteLine("{0} = {1}", kvp.Key, kvp.Value);
CoolObject co=JsonConvert.DeserializeObject(jsonData);
foreach(co.Values中的KeyValuePair kvp)
WriteLine(“{0}={1}”,kvp.Key,kvp.Value);

您的JSON不是有效的JSON,它应该更像这样:

{
    "TypeName": "MyType",
    "Values": {
        "value1": 12,
        "value2": "asdf",
        "value3": 32.2
    }
}
int intValue;
if (int.TryParse(co.Values.value1.ToString(), out intValue))
{
  // it was int and you now have its value in intValue
}
else 
{
  // it was string
}
class CoolObject
{
  public string TypeName { get; set; }
  public Dictionary<string, object> Values { get; set; }
}
  CoolObject co = JsonConvert.DeserializeObject<CoolObject>(jsonData);
  foreach (KeyValuePair<string, object> kvp in co.Values)
    Console.WriteLine("{0} = {1}", kvp.Key, kvp.Value);
或者你可以在那里使用数组。但我们假设它是这样的。然后,您可以尝试使用以下类:

class CoolObjectValues
{
  public object value1 { get; set; }
  public object value2 { get; set; }
  public object value3 { get; set; }
}

class CoolObject
{
  public string TypeName { get; set; }
  public CoolObjectValues Values { get; set; }
}
请注意,当您想要处理CoolObjectValues中的值时,您需要确定值的类型。为此,您可以这样做:

{
    "TypeName": "MyType",
    "Values": {
        "value1": 12,
        "value2": "asdf",
        "value3": 32.2
    }
}
int intValue;
if (int.TryParse(co.Values.value1.ToString(), out intValue))
{
  // it was int and you now have its value in intValue
}
else 
{
  // it was string
}
class CoolObject
{
  public string TypeName { get; set; }
  public Dictionary<string, object> Values { get; set; }
}
  CoolObject co = JsonConvert.DeserializeObject<CoolObject>(jsonData);
  foreach (KeyValuePair<string, object> kvp in co.Values)
    Console.WriteLine("{0} = {1}", kvp.Key, kvp.Value);
更新:

对于数量不确定的值:

{
    "TypeName": "MyType", 
    "Values": {
        "value1": 12,
        "value2": "asdf",
        "value3": 32.2,
        ...
    }
}
您的类将如下所示:

{
    "TypeName": "MyType",
    "Values": {
        "value1": 12,
        "value2": "asdf",
        "value3": 32.2
    }
}
int intValue;
if (int.TryParse(co.Values.value1.ToString(), out intValue))
{
  // it was int and you now have its value in intValue
}
else 
{
  // it was string
}
class CoolObject
{
  public string TypeName { get; set; }
  public Dictionary<string, object> Values { get; set; }
}
  CoolObject co = JsonConvert.DeserializeObject<CoolObject>(jsonData);
  foreach (KeyValuePair<string, object> kvp in co.Values)
    Console.WriteLine("{0} = {1}", kvp.Key, kvp.Value);
类对象
{
公共字符串类型名{get;set;}
公共字典值{get;set;}
}
您可以这样使用它:

{
    "TypeName": "MyType",
    "Values": {
        "value1": 12,
        "value2": "asdf",
        "value3": 32.2
    }
}
int intValue;
if (int.TryParse(co.Values.value1.ToString(), out intValue))
{
  // it was int and you now have its value in intValue
}
else 
{
  // it was string
}
class CoolObject
{
  public string TypeName { get; set; }
  public Dictionary<string, object> Values { get; set; }
}
  CoolObject co = JsonConvert.DeserializeObject<CoolObject>(jsonData);
  foreach (KeyValuePair<string, object> kvp in co.Values)
    Console.WriteLine("{0} = {1}", kvp.Key, kvp.Value);
CoolObject co=JsonConvert.DeserializeObject(jsonData);
foreach(co.Values中的KeyValuePair kvp)
WriteLine(“{0}={1}”,kvp.Key,kvp.Value);

您可以将整数作为字符串发送,然后在服务器端使用逻辑转换它们以确定它们是否为数字,如果是,则转换为正确的类型

// Server-side CLR object
class CoolObject
{
    public string TypeName { get; set; }
    public IEnumerable<string> Values { get; set; }
}

// Client-side JSON sent to the server
{
    TypeName: "MyType",
    Values: [
        "12",
        "asdf",
        "32.2"
    ]
}
//服务器端CLR对象
类CoolObject
{
公共字符串类型名{get;set;}
公共IEnumerable值{get;set;}
}
//发送到服务器的客户端JSON
{
TypeName:“MyType”,
价值观:[
"12",
“asdf”,
"32.2"
]
}

您可以将整数作为字符串发送,然后在服务器端使用逻辑转换它们以确定它们是否为数字,如果是,则转换为正确的类型

// Server-side CLR object
class CoolObject
{
    public string TypeName { get; set; }
    public IEnumerable<string> Values { get; set; }
}

// Client-side JSON sent to the server
{
    TypeName: "MyType",
    Values: [
        "12",
        "asdf",
        "32.2"
    ]
}
//服务器端CLR对象
类CoolObject
{
公共字符串类型名{get;set;}
公共IEnumerable值{get;set;}
}
//发送到服务器的客户端JSON
{
TypeName:“MyType”,
价值观:[
"12",
“asdf”,
"32.2"
]
}

刚刚输入了这个。首先做一个数字类型的tryPARSE,然后把它看作一个字符串。我的错误,我修复了JSON的语法。我还略微阐述了这个问题:值的数量没有设置。因此,将对象放入CoolObject不会像这样工作。:-)谢谢我在路上,但是我在早上试着做这个。只是打字。首先做一个数字类型的tryPARSE,然后把它看作一个字符串。我的错误,我修复了JSON的语法。我还略微阐述了这个问题:值的数量没有设置。因此,将对象放入CoolObject不会像这样工作。:-)谢谢我在路上,但我在早上尝试第一件事。为什么不使用NeNothFut.jShan.LIQ并将文本解析成动态对象?为什么不使用NeNtHoSt.JSON.LIQ并将文本解析成动态对象?