使用JSON.NET读取JSON

3
如何使用JSON.NET反序列化以下JSON:
{
"adjusted_amount":200.0,
"amount":2,
"uid":"admin",
"extra_params": {"uid":"admin","ip":"83.26.141.183","user_agent":"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36"}
}

我有以下代码(但问题可能出在“extra_params”上,它不是一个字符串)。我考虑为“extra_params”创建新的类,但问题是“extra_params”中的数据可能会发生变化。
我根本不需要阅读“extra_params”。我需要的所有信息都来自前三个JSON变量。
我的代码:
public class RecData1
{
    public string uid { get; set; }
    public int amount { get; set; }
    public int adjusted_amount { get; set; }
    public string extra_params { get; set; }
}

var data = JsonConvert.DeserializeObject<RecData1>(payload);

其中payload = 粘贴在第一个引号中的字符串

编辑:我现在收到的错误:

Error reading string. Unexpected token: StartObject. Path 'extra_params', line 1,     position 28.

at Newtonsoft.Json.JsonReader.ReadAsStringInternal()
at Newtonsoft.Json.JsonTextReader.ReadAsString()
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType(JsonReader reader, JsonContract contract, Boolean hasConverter)

你收到了哪些错误信息? - SalGad
现在:读取字符串时出错。意外的令牌:StartObject。路径'extra_params',行1,位置28。 在Newtonsoft.Json.JsonReader.ReadAsStringInternal()处 在Newtonsoft.Json.JsonTextReader.ReadAsString()处 在Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType(JsonReader reader,JsonContract contract,Boolean hasConverter)处 - user2441297
1
你确定你的JSON格式正确吗?它可能是对象或字符串数组,而不仅仅是另一个JSON字符串。它也不能是下划线,下划线在JSON中是完全合法的。 - SalGad
4个回答

1
你可以通过使用 dynamic 再向前迈进一步:
 dynamic x = JsonConvert.DeserializeObject(payload);
 var data = new RecData1()
                 {
                     uid = x.uid,
                     amount = x.amount,
                     adjusted_amount = x.adjusted_amount
                 };

1
首先,您面临的问题是adjusted_amount不是int类型,而是十进制数(这也可能会导致本地化问题)。
其次,您可以在RecData1类中删除字符串extra_params,这将解决问题。
{
"adjusted_amount":200,
"amount":2,
"uid":"admin",
"extra_params": {"uid":"admin","ip":"83.26.141.183","user_agent":"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36"}
}

public class RecData1
{
    public string uid { get; set; }
    public int amount { get; set; }
    public int adjusted_amount { get; set; }
    //public string extra_params { get; set; }
}

1
我刚刚弄明白了这个问题,正准备发送我的答案。但你比我先发了!(INT的问题) - user2441297

0

我认为问题是因为你的json中额外的参数不是字符串。

应该像这样:

"extra_params": {"string........................................."}

它应该可以工作。或者你需要更改你的类以考虑另一个具有JSON中所有属性的对象。


0
如果你想获取extra_params,你可以尝试这样做:
public class RecData1
{
    public string uid { get; set; }
    public int amount { get; set; }
    public int adjusted_amount { get; set; }
    public Dictionary<string,string> extra_params { get; set; }
}

var data = JsonConvert.DeserializeObject<RecData1>(payload);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接