我正在开发一个 iOS 应用程序,使用 swift 4.0(4.2 有同样的问题)。
我为 Encodable 添加了扩展
extension Encodable{
func toDict() throws -> [String:Any]? {
let jsonEncoder = JSONEncoder()
let jsonData = try jsonEncoder.encode(self)
do{
return try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any]
}
catch{
return nil
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个 Encodable 类的实例,它的属性也属于 Encodable 类,并注意到在instance.toDict()经常调用时,我的应用程序使用的内存增加了很多。即使我不使用返回的结果也是如此,如果我返回 nil 并忽略JSONSerialization.jsonObject.
我确定是这一行导致了问题(忽略结果并返回 nil 仍然会导致问题,注释该行并返回 nil 将停止内存增加。
随着时间的推移,内存越来越大,toDict()被调用的次数也越来越多,我最终在 10 分钟内使用了 400MB。
有没有人遇到过这个问题?有解决办法吗?
有没有办法NSJSONSerialization检查是否NSData是有效的JSON?如果API由于某种原因返回无效的JSON,我不希望应用程序出错.
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
NSError *error;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
Run Code Online (Sandbox Code Playgroud) 我在解析JSON时收到此错误:
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Unable to convert data to string around character 73053.) UserInfo=0x1d5d8250 {NSDebugDescription=Unable to convert data to string around character 73053.}
Run Code Online (Sandbox Code Playgroud)
有任何建议如何解决这个问题?
添加 正如错误报告中所述,解析器无法通过位置73053处的字符,即我的JSON响应中的"ø".据我所知,像Ø,Å,Æ等字符不应该是json解析器的问题?
我有一个NSURLConnection和所有适当的方法在一个视图控制器中工作.然后我将它移动到UICollectionViewController并在下面获得一个例外
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSError *jsonParsingError = nil;
//error right here!
NSString
*object = [NSJSONSerialization JSONObjectWithData:self.jsonReceivedData options:NSJSONReadingMutableContainers error:&jsonParsingError];
if (jsonParsingError) {
NSLog(@"JSON ERROR: %@", [jsonParsingError localizedDescription]);
} else {
NSLog(@"LIST: %@", object);
}
}
Run Code Online (Sandbox Code Playgroud)
错误是: *由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'data parameter is nil'
有人有主意吗?
我正在使用NSJSONSerialization将字典转换为JSON.
如果我在该字典中包含NSDecimalNumber(== 0),则输出为0.这是错的.0是一个int.我需要输出为0.0.
这就是我正在做的事情:
NSDecimalNumber *decimal = [[NSDecimalNumber alloc] initWithFloat:0.0f];
// when fed into NSJSONSerialization it outputs as 0
Run Code Online (Sandbox Code Playgroud)
有没有办法输出0.0?
或者我的假设不正确吗?是0有效的浮动?
我在我的应用程序中实现了Web服务.我的方式很典型.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//Web Service xxx,yyy are not true data
NSString *urlString = @"http://xxx.byethost17.com/yyy";
NSURL *url = [NSURL URLWithString:urlString];
dispatch_async(kBackGroudQueue, ^{
NSData* data = [NSData dataWithContentsOfURL: url];
[self performSelectorOnMainThread:@selector(receiveLatest:) withObject:data waitUntilDone:YES];
});
return YES;
}
- (void)receiveLatest:(NSData *)responseData {
//parse out the json data
NSError* error;
NSDictionary* json = [NSJSONSerialization
JSONObjectWithData:responseData
options:kNilOptions
error:&error];
NSString *Draw_539 = [json objectForKey:@"Draw_539"];
....
Run Code Online (Sandbox Code Playgroud)
控制台错误消息:
*由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:'data parameter is nil'
当我的iPhone连接到Internet时,该应用程序成功运行.但如果它断开连接到互联网,应用程序将崩溃NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
你能告诉我如何处理这个错误?有NSError帮助吗?
如何使用NSJSONSerialization dataWithJSONObject从NSDictionary中获取json中的true/false(而不是"true"/"false")?我应该在词典中存储哪些键才能获得该键?
我有一个看起来像这样的类:
class Foo {
var bar = Int()
}
class Bar {
var baz = String()
var arr = [Foo]()
}
Run Code Online (Sandbox Code Playgroud)
我有一个Bar结构的对象,我需要序列化为JSON:
let instance = Bar()
Run Code Online (Sandbox Code Playgroud)
通过标准库或某些第三方库实现它的更优雅方式是什么?
提前致谢.
我有这样的后端响应字符串:
{
"status": "success",
"data": "{\"name\":\"asd\",\"address\":\"Street 1st\"}"
}
Run Code Online (Sandbox Code Playgroud)
我认为问题是因为数据字符串中的双引号(“)。当我删除双引号时,序列化成功。但是响应来自后端,因此我必须处理它。
任何人都可以解决这个问题吗?
谢谢。
这是游乐场代码。
import Foundation
var jsonStr = """
{
"status": "success",
"data": "{\"name\":\"asd\",\"address\":\"Street 1st\"}"
}
"""
let data = jsonStr.data(using: .utf8)
if let d = data {
do {
let o = try JSONSerialization.jsonObject(with: d)
print(o)
} catch let e {
print(e)
}
} else {
print("DATA conversion ERROR")
}
Run Code Online (Sandbox Code Playgroud) 我在 VSCode 中运行代码并得到 TypeError: Object of type set is not JSON serializable。我刚开始学习编码,实在不懂,google了一下,也不知道JSON可序列化是什么意思。
from solcx import compile_standard
import json
# get the contract content
with open("./SimpleStorage.sol", "r") as file:
simple_storage_file = file.read()
# compile the contract
compiled_sol = compile_standard(
{
"language": "Solidity",
"sources": {"SimpleStorage.sol": {"content": simple_storage_file}},
"settings": {
"outputSelection": {
"*": {
"*": {"abi", "metadata", "evm.bytecode", "evm.bytecode.sourceMap"}
}
}
},
},
solc_version="0.6.0",
)
# creat json file dump the comiled code in it to make it more readable.
with open("compiled_code.json", …Run Code Online (Sandbox Code Playgroud) ios ×8
json ×5
objective-c ×3
swift ×3
cocoa ×1
cocoa-touch ×1
foundation ×1
ios5 ×1
iphone ×1
memory-leaks ×1
python ×1
solidity ×1
web-services ×1
xcode ×1