【问题标题】:Strange Json Behavior with the same Request具有相同请求的奇怪 Json 行为
【发布时间】:2014-08-05 06:47:40
【问题描述】:

我正在使用 WebApi 发送 json 数据,并且我的 Json 结构包含:

{"totalAmount":0.01,"transactions":[{"Tokens":1,"transactionDI":1,"deviceUserDI":2,"routeDI":1,"DateTimeProceed":"\/Date(1406482920000+0100)\/","Typetran":1,"usedtokens":[{"usedtokenValue":9.32,"usedtokenType":3,"usedtokenId":"d798ee2d920e488487014d2a5ce46e7f"}]}],"numberofTransactions":1,"type":"insertit","validation":"68W956!8$97123@Y$"}

我使用 fiddler 发送,使用 dynamic objectData 访问,然后使用 JsonConvert.DeserializeObject 反序列化。

之后,我将带有 objectData.ToString() 的相同请求插入到数据库中, 相同的结果存储到数据库中(字符串结果)。

但是当我尝试使用时

{
  "totalAmount": 0.01,
  "transactions": [
    {
      "Tokens": 1,
      "transactionDI": 1,
      "deviceUserDI": 2,
      "routeDI": 1,
      "DateTimeProceed": "\/Date(1406482920000+0100)\/",
      "Typetran": 1,
      "usedtokens": [
        {
          "usedtokenValue": 9.32,
          "usedtokenType": 3,
          "usedtokenId": "d798ee2d920e488487014d2a5ce46e7f"
        }
      ]
    }
  ],
  "numberofTransactions": 1,
  "type": "insertit",
  "validation": "68W956!8$97123@Y$"
}

这以我在上面使用的相同方式存储数据,但它以我发送的相同格式存储到数据库中

现在数据库中两者的区别是:

我用来获取请求的方法

[HttpPost]
public JObject UploadIT(dynamic objectData)
{
  //stuffs
}

谁能告诉我为什么以不同的方式插入相同的记录?

【问题讨论】:

  • 你在反序列化对象上调用 object.ToString() 吗?
  • 我正在反序列化使用:MyModel transactionData = JsonConvert.DeserializeObject(objectData.ToString());
  • 好的,你能展示一下你从请求中创建动态对象的方法吗?
  • 我已经编辑了我的问题,请查看

标签: c# json asp.net-mvc-4 dynamic


【解决方案1】:

根据您的操作代码,行为是正确的。 由于您的 objectData 包含换行符,并且您仅将其插入到数据库中,因此会保留换行符。

你可以试试objectData.ToString().Replace("\r\n", string.Empty);

更新:你可以objectData.ToString().Replace(" ", string.Empty).Replace("\r\n", string.Empty);

如果您确定请求来自 Windows,也可以使用 Environment.Newline 代替 \r\n

更新 2:如果你想存储漂亮的打印版本,你必须重新序列化 transactionData:JsonConvert.SerializeObject(transactionData, Formatting.Indented);我不能 100% 确定它是否会插入空格在':'之后,但你总是可以然后.Replace(":", ": ");

【讨论】:

  • 感谢您的回答,但如果您可以仔细检查图像,您会发现其中一个名为“Tokens”的对象在第一个“Tokens”:1 和第二个中具有行为"Tokens": 1(你可以在该数组的任何对象中看到这种差异)
  • @cracker,屏幕截图再次与您发布的提琴手请求匹配 - 检查请求,您在值之前有空格。
  • 我正在做的是我发送第一个不带空格的数组,它的插入方式相同,但是当我格式化将空格添加到请求中的 json 对象时,我需要做什么这种情况因为两者都是数组但格式不同
  • @cracker 是你的目标是让这两个都在数据库中没有空格吗?然后使用我提供的代码。
  • 我想将包含空格的数组对象存储到数据库中。
【解决方案2】:

已解决:

dynamic model = JObject.Parse(objectData.ToString());

我正在使用 objectData.ToString() 并再次将其解析为动态对象,并将我无法找到的空格添加到数组中。

如果我不想再次将其分配给动态对象,我也可以直接与 JObject.Parse(objectData.ToString()) 一起使用。

【讨论】:

    猜你喜欢
    • 2021-05-26
    • 2013-06-24
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    相关资源
    最近更新 更多